【问题标题】:rename column names dynamically in dplyr chain [duplicate]在 dplyr 链中动态重命名列名[重复]
【发布时间】:2018-02-27 14:56:33
【问题描述】:

这是一个例子

temp <- mtcars
colnames(temp)[grepl("ge", colnames(temp))] <- "garbage"

输出

                     mpg cyl  disp  hp drat    wt  qsec vs am garbage carb
Mazda RX4           21.0   6 160.0 110 3.90 2.620 16.46  0  1       4    4
Mazda RX4 Wag       21.0   6 160.0 110 3.90 2.875 17.02  0  1       4    4
Datsun 710          22.8   4 108.0  93 3.85 2.320 18.61  1  1       4    1
Hornet 4 Drive      21.4   6 258.0 110 3.08 3.215 19.44  1  0       3    1
Hornet Sportabout   18.7   8 360.0 175 3.15 3.440 17.02  0  0       3    2
Valiant             18.1   6 225.0 105 2.76 3.460 20.22  1  0       3    1

我只知道列名将以什么开头(“ge”),但我不确定列名的确切含义

我想要一个在dplyr 链中工作的解决方案

temp %>%
   rename(vars(starts_with("ge")), "garbage")
Error: All arguments must be named

当然不行。感谢您的帮助

【问题讨论】:

    标签: r dplyr rename


    【解决方案1】:

    您可以使用rename_at。如果您知道只有一列以“ge”开头,这将起作用:

    library(dplyr)
    mtcars %>% 
      rename_at(vars(starts_with("ge")), funs(paste0("garbage")))
    

    如果要重命名多个列,funs() 中的函数需要返回名称向量,或者执行gsub() 之类的操作来为现有列名称添加一些内容。

    【讨论】:

    • 太棒了,谢谢!没有意识到它的存在(除了其他verb_ats。)你如何接受一个论点并没有多大意义,但这可能就是它的设计方式。
    • 我发现_all_if_at 变体的语法让我自己很困惑。某处一定有很好的教程!
    • 不错的答案,但您必须提供一个函数来指定替换字符串,这有点奇怪。
    • 对于重命名单列,另一种解决方案是mtcars %&gt;% rename_at(vars(starts_with("ge")), ~"garbage")。为何如此有效,请参阅此处的 cmets:stackoverflow.com/a/44452676/3926543.
    • @thelatemail,类似mtcars %&gt;% rename_at(vars(starts_with("d")), ~c("d1", "d2"))?当然,这也有效。我更喜欢mtcars %&gt;% rename_at(vars(starts_with("d")), ~rep("grabage", length(.)))
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-01-30
    • 2021-10-22
    • 1970-01-01
    • 2021-03-28
    • 2014-02-18
    • 2018-09-13
    • 1970-01-01
    相关资源
    最近更新 更多