我想使用 dplyr::mutate() 在数据框中创建多个新列。列名及其内容应动态生成。来自 iris 的示例数据:library(dplyr)iris <- as_tibble(iris)我创建了一个函数来从 Petal.Width 变量改变我的新列:multipetal <- function(df, n) { varname <- paste("petal", n , sep=".") df <- mutate(df, varname = Petal.Width * n) ## problem arises here df}现在我创建一个循环来构建我的列:for(i in 2:5) { iris <- multipetal(df=iris, n=i)}然而,由于 mutate 认为 varname 是一个字面变量名,循环只创建一个新变量(称为 varname)而不是四个(称为 petal.2 - petal.5)。如何让 mutate() 使用我的动态名称作为变量名称? 最佳答案 由于您将变量名动态构建为字符值,因此使用标准 data.frame 索引进行赋值更有意义,该索引允许列名的字符值。例如:multipetal <- function(df, n) { varname <- paste("petal", n , sep=".") df[[varname]] <- with(df, Petal.Width * n) df}mutate 函数使通过命名参数命名新列变得非常容易。但这假设您在键入命令时知道名称。如果要动态指定列名,则还需要构建命名参数。dplyr 版本 >= 1.0使用最新的 dplyr 版本,在使用 glue 命名参数时,您可以使用 := 包中的语法。所以这里名称中的 {} 通过评估里面的表达式来获取值。multipetal <- function(df, n) { mutate(df, "petal.{n}" := Petal.Width * n)}dplyr 版本 >= 0.7dplyr 从版本 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 & dplyr (>=0.3 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 请注意,这在最初提出问题时存在的旧版本 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)}关于r - 在 `dplyr` 中使用动态变量名,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/26003574/
10-12 19:10