【问题标题】:automatically rename multiple columns with piping an elegant way以优雅的方式自动重命名多个列
【发布时间】:2017-09-15 23:57:00
【问题描述】:

我正在寻找一种简短而优雅的方式来使用 dplyr 和管道在 R 中选择和重命名列。

我已经成功地做我想做的事,但它笨拙且难以编写脚本,所以我正在寻找更好的方法。

这是有效的:

tab <- as.data.frame(matrix(round(runif(15,0,50)),3,5))
colnames(tab) <- c("badvar1", "badvar2","badname1","badname2","badname3")
tab %>% 
   select(c("badname1","badname2","badname3")) %>%
   rename(goodname1 = badname1, goodname2 = badname2 ,goodname3 = badname3)

   goodname1 goodname2 goodname3
1        48        32        28
2        38        31         5
3        19        43        41

这里的问题是我有超过 3 个变量要重命名(想象 50 个),所以我不想手动写 50 次 newvar1=var1, newvar2=var2, ...。所以我一直在寻找下一个脚本的精神,但它不起作用:

vector_of_good_var_name <- c("goodname1","goodname2","goodname3")

tab %>% 
   select(c("badname1","badname2","badname3")) %>%
     rename(vector_of_good_var_name)
Error: All arguments must be named

我也尝试过这个(非常不优雅,无论如何也没有用......):

test <- list("badname1","badname2","badname3")
names(test) <- c("goodname1","goodname2","goodname3")
tab %>% 
   select(c("badname1","badname2","badname3")) %>%
     rename(test)
Error: All arguments must be named

知道如何使用管道更好地脚本重命名变量吗?

【问题讨论】:

  • tab %&gt;% select(...) %&gt;% setNames(vector_of_good_var_name)?
  • 是的@r2evans!就这么简单!发布它作为答案,我会接受它。

标签: r dplyr


【解决方案1】:

两种选择:

  1. dplyr:tab %&gt;% rename_(.dots = test)

    这有使用命名重命名的好处,因此test 变量内容和名称的顺序无关紧要。

    这有个缺点是rename_soft-deprecated;在时间线上不确定。这表明建议将转移到rename_atrename_all 和/或rename_if,需要一个辅助函数在旧名称和新名称之间进行转换。

  2. Base R(重命名,仍在使用dplyr 管道):tab %&gt;% select(...) %&gt;% setNames(vector_of_good_var_name)

    我认为setNames 不会很快被弃用...

【讨论】:

  • %&gt;% 不是基础 R :-)
  • G5W:好吧,你知道了,但是……它已经加载到了OP环境中,所以我作弊了……但你是对的。
猜你喜欢
  • 1970-01-01
  • 2023-01-20
  • 2019-05-09
  • 1970-01-01
  • 1970-01-01
  • 2017-09-13
  • 2010-10-26
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多