【发布时间】:2014-12-15 17:16:19
【问题描述】:
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
而我希望“新”列是我构造的字符串的名称(“x_1”),即
a x_1
1 1 4
2 2 5
3 3 6
有没有办法做到这一点?
【问题讨论】:
-
来自announcement of
dplyr 0.3:“您现在可以使用dplyr进行编程 - 每个使用非标准评估 (NSE) 的函数还有一个以_结尾的标准评估 (SE) 双胞胎[...] 每个函数的 SE 版本都有类似的参数,但必须明确地“引用”它们。”因此,请检查rename_在这里是否有用。 -
谢谢,知道这很有用,但在这种情况下它实际上并没有改变任何东西。如果我传入的列是旧的列名,它会起作用,但是将上述函数更改为使用 rename_ (并将 old 放在引号中)仍然返回相同的
-
@user1165199 我会做
colnames(df)[colnames(df) %in% "old"] <- paste0("x","_")(如果有必要,在函数中),因为它能够轻松替换名称向量。 -
谢谢akrun,这就是我最后所做的。只是希望有一种使用现有函数的更简洁的方法。
-
我想向所有列名发送一个串联列表。
df`new <- c("a.new", "b.new")%>%names(.) <- rename_(new)