由于动态地将变量名构建为字符值,因此使用标准data.frame索引(允许为列名提供字符值)进行赋值更有意义。例如:
multipetal <- function(df, n) {
varname <- paste("petal", n , sep=".")
df[[varname]] <- with(df, Petal.Width * n)
df
}
mutate函数使得通过命名参数命名新列变得非常容易。但这假设您在键入命令时知道名称。如果希望动态指定列名,则还需要构建named参数。
双版本>= 1.0
在最新的dplyr版本中,您可以在使用:=命名参数时使用glue包中的语法。因此,这里名称中的{}通过计算其中的表达式来获取值。
multipetal <- function(df, n) {
mutate(df, "petal.{n}" := Petal.Width * n)
}
如果要向函数传递列名,可以在字符串中使用{{}},也可以在列名中使用{{}}
meanofcol <- function(df, col) {
mutate(df, "Mean of {{col}}" := mean({{col}}))
}
meanofcol(iris, Petal.Width)
dpoyr版本
从0.7版开始,Dplyr允许您使用:=来动态分配参数名。你可以这样写你的函数:
# --- dplyr version 0.7+---
multipetal <- function(df, n) {
varname <- paste("petal", n , sep=".")
mutate(df, !!varname := Petal.Width * n)
}
有关更多信息,请参阅从vignette(“programming”,“dplyr”)中获得的文档。
dplyr (>=0.3 & <0.7)
稍早一些的dplyr版本(>=0.3 <0.7)鼓励使用“标准求值”替代许多函数。有关更多信息,请参阅非标准评估小插图(小插图(“nse”))。
所以在这里,答案是使用mutate_()而不是mutate(),并执行:
# --- dplyr version 0.3-0.5---
multipetal <- function(df, n) {
varname <- paste("petal", n , sep=".")
varval <- lazyeval::interp(~Petal.Width * n, n=n)
mutate_(df, .dots= setNames(list(varval), varname))
}
双工< 0.3
注意,在最初提出问题时存在的旧版本的dplyr中也可能存在这种情况。它需要小心使用quote和setName:
# --- dplyr versions < 0.3 ---
multipetal <- function(df, n) {
varname <- paste("petal", n , sep=".")
pp <- c(quote(df), setNames(list(quote(Petal.Width * n)), varname))
do.call("mutate", pp)
}