在dplyr的重命名函数中输入新的列名作为字符串

时间:2014-10-20 16:29:54

标签: r dplyr

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

有没有这样做?

2 个答案:

答案 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)

tidyrdplyr的最新更新允许您使用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]})