使用管道以优雅的方式自动重命名多个列

时间:2017-09-15 15:37:49

标签: r dplyr

我正在寻找一种简短而优雅的方法,使用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

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

1 个答案:

答案 0 :(得分:2)

两个选项:

  1. dplyrtab %>% rename_(.dots = test)

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

    这样做的缺点是rename_soft-deprecated;在时间表上不确定。这表明该建议将转移到rename_atrename_all和/或rename_if,需要辅助功能在旧名称和新名称之间进行转换。

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

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