dplyr的重命名函数要求将新列名作为不带引号的变量名传递。但是我有一个函数,通过将字符串粘贴到传入的参数上来构造列名,因此是一个字符串。
例如说我有这个功能
myFunc <- function(df, col){
new <- paste0(col, '_1')
out <- dplyr::rename(df, new = old)
return(out)
}
如果我运行
df <- data.frame(a = 1:3, old = 4:6)
myFunc(df, 'x')
我得到了
a new
1 1 4
2 2 5
3 3 6
我希望'new'列是我构造的字符串的名称('x_1'),即
a x_1
1 1 4
2 2 5
3 3 6
有没有这样做?
答案 0 :(得分:21)
我认为这就是你要找的东西。正如@Henrik建议的那样使用rename_
,但是这个论点有一个有趣的名字:
> myFunc <- function(df, col){
+ new <- paste0(col, '_1')
+ out <- dplyr::rename_(df, .dots=setNames(list(col), new))
+ return(out)
+ }
> myFunc(data.frame(x=c(1,2,3)), "x")
x_1
1 1
2 2
3 3
>
请注意使用setNames
在列表中使用new作为名称的值。
答案 1 :(得分:0)
对tidyr
和dplyr
的最新更新允许您使用rename_with
函数。
假设您有一个数据框:
library(tidyverse)
df <- tibble(V0 = runif(10), V1 = runif(10), V2 = runif(10), key=letters[1:10])
您想更改所有“ V”列。通常,我对此类列的引用来自一个json文件,该文件在R中是一个带标签的列表。例如,
colmapping <- c("newcol1", "newcol2", "newcol3")
names(colmapping) <- paste0("V",0:2)
然后,您可以使用以下命令将df
的名称更改为colmapping
列表中的字符串:
df <- rename_with(.data = df, .cols = starts_with("V"), .fn = function(x){colmapping[x]})