dplyr中的mutate_each/summary_each:如何选择某些列并为变异列指定新名称?
我对dplyr中的mutate_each/summary_each:如何选择某些列并为变异列指定新名称?,r,dataframe,dplyr,R,Dataframe,Dplyr,我对dplyr动词mutate\u感到有点困惑。 使用基本的mutate将一列数据转换为(比如)z分数,并在data.frame中创建一个新列(这里的名称为z分数\数据): 到目前为止还不错。但到目前为止,我还没有弄清楚: 我如何给这些新列起合适的名称,就像我在mutate中那样 我如何选择我希望变异的某些列,就像我在第一种情况下使用select时所做的那样 感谢您的帮助。dplyr>=0.4.3.9000的更新 在dplyr开发版本0.4.3.9000(撰写本文时)中,已简化了mutate_e
dplyr
动词mutate\u感到有点困惑。
使用基本的mutate
将一列数据转换为(比如)z分数,并在data.frame中创建一个新列(这里的名称为z分数\数据
):
到目前为止还不错。但到目前为止,我还没有弄清楚:
mutate
中那样select
时所做的那样mutate_each
和summary_each
中的命名,如下所示:
summary_each()
和mutate_each()
的命名行为已被删除
进行了调整,以便可以强制包含函数和
变量名称:summary_每个(mtcars、funs(平均值=平均值)、everything())
如果您只想在mutate_each
/summary_each
中应用1个函数,并且希望为这些列指定新名称,则这一点非常重要
为了显示差异,这里是使用新命名功能的dplyr 0.4.3.9000的输出,与下面的选项a.2相比:
library(dplyr) # >= 0.4.3.9000
iris %>% mutate_each(funs(mysum = sum(.)), -Species) %>% head()
# Sepal.Length Sepal.Width Petal.Length Petal.Width Species Sepal.Length_mysum Sepal.Width_mysum
#1 5.1 3.5 1.4 0.2 setosa 876.5 458.6
#2 4.9 3.0 1.4 0.2 setosa 876.5 458.6
#3 4.7 3.2 1.3 0.2 setosa 876.5 458.6
#4 4.6 3.1 1.5 0.2 setosa 876.5 458.6
#5 5.0 3.6 1.4 0.2 setosa 876.5 458.6
#6 5.4 3.9 1.7 0.4 setosa 876.5 458.6
# Petal.Length_mysum Petal.Width_mysum
#1 563.7 179.9
#2 563.7 179.9
#3 563.7 179.9
#4 563.7 179.9
#5 563.7 179.9
#6 563.7 179.9
如果不提供新名称,而只提供1个函数,dplyr将更改现有列(与以前版本中一样):
我假设这个新功能将在下一个版本0.4.4中通过CRAN提供
dplyr版本将保留现有名称 a、 2如果指定新的列名扩展名: a、 3手动为每列指定一个新名称(但仅适用于少数列): a、 4使用命名向量创建具有新名称的其他列: 案例1:保留原始列 与选项a.1、a.2和a.3不同,dplyr将保持现有列不变,并以此方法创建新列。新列的名称等于您预先创建的命名向量的名称(本例中为
vars
)
b) 在mutate\u each
/summary\u each
b、 1让dplyr找出新名称
如果应用了多个函数,则可以让dplyr自己计算名称(并保留现有列):
b、 2手动指定新列名
使用多个函数时,另一个选项是自行指定列名扩展名:
iris %>% mutate_each(funs(MySum = sum(.), MyMean = mean(.)), -Species) %>% head()
# Sepal.Length Sepal.Width Petal.Length Petal.Width Species Sepal.Length_MySum Sepal.Width_MySum Petal.Length_MySum
#1 5.1 3.5 1.4 0.2 setosa 876 459 564
#2 4.9 3.0 1.4 0.2 setosa 876 459 564
#3 4.7 3.2 1.3 0.2 setosa 876 459 564
#4 4.6 3.1 1.5 0.2 setosa 876 459 564
#5 5.0 3.6 1.4 0.2 setosa 876 459 564
#6 5.4 3.9 1.7 0.4 setosa 876 459 564
# Petal.Width_MySum Sepal.Length_MyMean Sepal.Width_MyMean Petal.Length_MyMean Petal.Width_MyMean
#1 180 5.84 3.06 3.76 1.2
#2 180 5.84 3.06 3.76 1.2
#3 180 5.84 3.06 3.76 1.2
#4 180 5.84 3.06 3.76 1.2
#5 180 5.84 3.06 3.76 1.2
#6 180 5.84 3.06 3.76 1.2
我怎样才能像以前那样选择我希望变异的某些列
在第一种情况下使用select
您可以通过以下方式引用要变异(或省略)的列来实现这一点(变异萼片长度,但不是种类):
此外,您可以使用特殊函数选择要变异的列、以某个单词开头或包含该单词的所有列,例如:
iris %>% mutate_each(funs(sum), contains("Sepal"), -Species) %>% head()
iris %>% mutate_at(.vars=vars(Sepal.Width), .funs=funs(mysum = sum(.))) %>% head()
有关这些功能的更多信息,请参见?对每个
和?选择
评论后编辑1:
如果您想使用标准求值,dplyr提供了大多数函数的SE版本,这些函数的结尾都有一个附加的“\ux”。因此,在本例中,您将使用:
x <- c("Sepal.Width", "Sepal.Length") # vector of column names
iris %>% mutate_each_(funs(sum), x) %>% head()
x%mutate\u each\u(funs(sum),x)%>%head()
注意我在这里使用的mutate\u each\u
< >编辑2:用选项A.4/P>> P> <代码>突变>每个< /代码>将被弃用,考虑使用<代码>突变> 。从
dplyr_0.5.0
文档:
将来,mutate_each()和summary_each()将被弃用,取而代之的是更具特色的函数族:mutate_all()、mutate_at()、mutate_if()、summary_all()、summary_at()和summary_if()
将函数应用于所有变量(物种除外):
警告:“.cols”参数已弃用,请参阅底部的注释
将函数应用于变量子集
更新!适用于dplyr 0.7.1版本(2017-08-08)
如果您看到消息:
.cols
已被重命名且已弃用,请使用.vars
然后通过.vars
更改.cols
iris %>% mutate_at(.vars=vars(-Species), .funs=funs(mysum = sum(.))) %>% head()
另一个例子:
iris %>% mutate_each(funs(sum), contains("Sepal"), -Species) %>% head()
iris %>% mutate_at(.vars=vars(Sepal.Width), .funs=funs(mysum = sum(.))) %>% head()
相当于:
iris %>% mutate_at(.vars=vars("Sepal.Width"), .funs=funs(mysum = sum(.))) %>% head()
此外,在此版本中,mutate\u each
不推荐使用:
mutate\u each()
已弃用。
改用mutate\u all()
、mutate\u at()
或mutate\u if()
。
要在一组变量上映射funs
,请使用mutate_at()
谢谢,这太棒了。如果我可以这么大胆的话,最后一件事——有没有任何方法可以简单地覆盖我的数据帧,而不是将输出分配给新的数据帧?正如在
DF%etc
中一样,您可以将新的/变异的data.frame分配给相同的对象名称,例如iris%mutate\u each_uuu(funs(sum),x)%%>%head()
将更改iris数据集。如果您不想这样做,另一个选项是将其分配给新的data.frame,例如myiris%mutate\u each_uu(funs(sum),x)%%>%head()
。两种选择都是可行的possible@MattO“Brien有点晚了,但是对于看到这些评论的人来说:df%%mutate(…)%%>%…
有效,目前在magrittr主页底部提到:@kennyB,我已经更新了我的答案。看看选项a.4,即使用提供给mutate_each_
或summary_each_
@ML_Passion的命名向量,您可以这样做:mtcars%>%mutate_all(funs(十分位数=ntile(,10))
iris %>% mutate_each(funs(sum, mean), -Species) %>% head()
# Sepal.Length Sepal.Width Petal.Length Petal.Width Species Sepal.Length_sum Sepal.Width_sum Petal.Length_sum
#1 5.1 3.5 1.4 0.2 setosa 876 459 564
#2 4.9 3.0 1.4 0.2 setosa 876 459 564
#3 4.7 3.2 1.3 0.2 setosa 876 459 564
#4 4.6 3.1 1.5 0.2 setosa 876 459 564
#5 5.0 3.6 1.4 0.2 setosa 876 459 564
#6 5.4 3.9 1.7 0.4 setosa 876 459 564
# Petal.Width_sum Sepal.Length_mean Sepal.Width_mean Petal.Length_mean Petal.Width_mean
#1 180 5.84 3.06 3.76 1.2
#2 180 5.84 3.06 3.76 1.2
#3 180 5.84 3.06 3.76 1.2
#4 180 5.84 3.06 3.76 1.2
#5 180 5.84 3.06 3.76 1.2
#6 180 5.84 3.06 3.76 1.2
iris %>% mutate_each(funs(MySum = sum(.), MyMean = mean(.)), -Species) %>% head()
# Sepal.Length Sepal.Width Petal.Length Petal.Width Species Sepal.Length_MySum Sepal.Width_MySum Petal.Length_MySum
#1 5.1 3.5 1.4 0.2 setosa 876 459 564
#2 4.9 3.0 1.4 0.2 setosa 876 459 564
#3 4.7 3.2 1.3 0.2 setosa 876 459 564
#4 4.6 3.1 1.5 0.2 setosa 876 459 564
#5 5.0 3.6 1.4 0.2 setosa 876 459 564
#6 5.4 3.9 1.7 0.4 setosa 876 459 564
# Petal.Width_MySum Sepal.Length_MyMean Sepal.Width_MyMean Petal.Length_MyMean Petal.Width_MyMean
#1 180 5.84 3.06 3.76 1.2
#2 180 5.84 3.06 3.76 1.2
#3 180 5.84 3.06 3.76 1.2
#4 180 5.84 3.06 3.76 1.2
#5 180 5.84 3.06 3.76 1.2
#6 180 5.84 3.06 3.76 1.2
iris %>% mutate_each(funs(sum), Sepal.Length, -Species) %>% head()
iris %>% mutate_each(funs(sum), contains("Sepal"), -Species) %>% head()
x <- c("Sepal.Width", "Sepal.Length") # vector of column names
iris %>% mutate_each_(funs(sum), x) %>% head()
iris %>% mutate_at(.cols=vars(-Species), .funs=funs(mysum = sum(.))) %>% head()
Sepal.Length Sepal.Width Petal.Length Petal.Width Species Sepal.Length_mysum Sepal.Width_mysum
1 5.1 3.5 1.4 0.2 setosa 876.5 458.6
2 4.9 3.0 1.4 0.2 setosa 876.5 458.6
3 4.7 3.2 1.3 0.2 setosa 876.5 458.6
4 4.6 3.1 1.5 0.2 setosa 876.5 458.6
5 5.0 3.6 1.4 0.2 setosa 876.5 458.6
6 5.4 3.9 1.7 0.4 setosa 876.5 458.6
Petal.Length_mysum Petal.Width_mysum
1 563.7 179.9
2 563.7 179.9
3 563.7 179.9
4 563.7 179.9
5 563.7 179.9
6 563.7 179.9
vars_to_process=c("Petal.Length","Petal.Width")
iris %>% mutate_at(.cols=vars_to_process, .funs=funs(mysum = sum(.))) %>% head()
Sepal.Length Sepal.Width Petal.Length Petal.Width Species Petal.Length_mysum Petal.Width_mysum
1 5.1 3.5 1.4 0.2 setosa 563.7 179.9
2 4.9 3.0 1.4 0.2 setosa 563.7 179.9
3 4.7 3.2 1.3 0.2 setosa 563.7 179.9
4 4.6 3.1 1.5 0.2 setosa 563.7 179.9
5 5.0 3.6 1.4 0.2 setosa 563.7 179.9
6 5.4 3.9 1.7 0.4 setosa 563.7 179.9
iris %>% mutate_at(.vars=vars(-Species), .funs=funs(mysum = sum(.))) %>% head()
iris %>% mutate_at(.vars=vars(Sepal.Width), .funs=funs(mysum = sum(.))) %>% head()
iris %>% mutate_at(.vars=vars("Sepal.Width"), .funs=funs(mysum = sum(.))) %>% head()