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
    时所做的那样
  • 感谢您的帮助。

    dplyr>=0.4.3.9000的更新 在dplyr开发版本0.4.3.9000(撰写本文时)中,已简化了
    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()