【问题标题】:Mutate_at , add column by specifying column names [duplicate]mutate_at ,通过指定列名添加列[重复]
【发布时间】:2020-11-30 23:31:15
【问题描述】:

我有iris 数据框。我想添加列“log_Sepal.Length”和“log_Sepal.Width”,它们是将日志应用于“Sepal.Length”和“Sepal.Width”的结果。我试过了:

iris %>% 
  mutate_at(.vars = vars(names(.)[str_detect(names(.), "Sepal")] ), .funs = c("identity", "log"))

但我想要的数据框是:

iris$log_Sepal.Length <- log(iris$Sepal.Length) 
iris$log_Sepal.Width <- log(iris$Sepal.Width)  
iris 

mutate_at 可以吗?

【问题讨论】:

    标签: r dplyr


    【解决方案1】:

    你可以使用:

    library(dplyr)
    iris %>% mutate_at(vars(contains('Sepal')), list(log = ~log(.)))
    

    但是,mutate_at 已被弃用,请使用 dplyr 1.0.0 中的 across

    iris %>% mutate(across(contains('Sepal'), log, .names = 'log_{col}'))
    
    #  Sepal.Length Sepal.Width Petal.Length Petal.Width Species log_Sepal.Length log_Sepal.Width
    #1          5.1         3.5          1.4         0.2  setosa         1.629241        1.252763
    #2          4.9         3.0          1.4         0.2  setosa         1.589235        1.098612
    #3          4.7         3.2          1.3         0.2  setosa         1.547563        1.163151
    #4          4.6         3.1          1.5         0.2  setosa         1.526056        1.131402
    #5          5.0         3.6          1.4         0.2  setosa         1.609438        1.280934
    #6          5.4         3.9          1.7         0.4  setosa         1.686399        1.360977
    #...
    #...
    

    【讨论】:

    • 所以不能同时重命名新列?
    • 您可以使用.namesacross 中重命名,如答案所示。你需要什么列名?
    • 谢谢,但是我没有名为 "across" 的函数,那是因为我的包 "dplyr" 没有更新?
    • 是的,across 是在dplyr 1.0.0 中引入的。如果您有以前的版本,您可以使用mutate_at,然后根据您的选择使用rename 重命名列。
    • 或许可以使用iris %&gt;% mutate_at(vars(contains('Sepal')), list(log = ~log(.))) %&gt;% rename_at(vars(ends_with('log')), ~paste0('log_', sub('_log$', '', .)))
    猜你喜欢
    • 2014-02-18
    • 1970-01-01
    • 1970-01-01
    • 2020-02-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-10-26
    • 2022-12-02
    相关资源
    最近更新 更多