由于您正在动态地将变量名构建为字符值,因此使用标准data.frame索引进行赋值更加有意义,该索引允许为列名使用字符值。例如:
multipetal <- function(df, n) {
varname <- paste("petal", n , sep=".")
df[[varname]] <- with(df, Petal.Width * n)
df
}
该mutate
函数使通过命名参数命名新列变得非常容易。但这假设您在键入命令时知道名称。如果要动态指定列名,则还需要构建named参数。
dplyr版本> = 0.7
最新版本的dplyr
(0.7)通过使用:=
来动态分配参数名称。您可以将函数编写为:
# --- 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)的稍早版本鼓励对许多功能使用“标准评估”替代方法。有关更多信息,请参见非标准评估图vignette("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))
}
dplyr <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)
}