gpt4 book ai didi

r - 对 `dplyr` 中的新列/变量使用动态名称

转载 作者:行者123 更新时间:2023-12-03 04:28:29 27 4
gpt4 key购买 nike

我想使用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)
}

如果要将列名称传递给函数,则可以在字符串中以及列名称中使用 {{}}

meanofcol <- function(df, col) {
mutate(df, "Mean of {{col}}" := mean({{col}}))
}
meanofcol(iris, Petal.Width)

<小时/>

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 中也是可能的。它需要小心使用 quotesetName:

# --- 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/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com