我正在寻找一种简短而优雅的方法,使用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
知道如何更好地用管道重命名变量脚本吗?
答案 0 :(得分:2)
两个选项:
dplyr
:tab %>% rename_(.dots = test)
这有使用命名重命名的好处,因此test
变量内容和名称的顺序无关紧要。
这样做的缺点是rename_
是soft-deprecated;在时间表上不确定。这表明该建议将转移到rename_at
,rename_all
和/或rename_if
,需要辅助功能在旧名称和新名称之间进行转换。
Base R(重命名,仍使用dplyr
管道):tab %>% select(...) %>% setNames(vector_of_good_var_name)
我不认为setNames
会很快被弃用......