对`dplyr`中的新列/变量使用动态名称 [英] Use dynamic name for new column/variable in `dplyr`
本文介绍了对`dplyr`中的新列/变量使用动态名称的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
dplyr::mutate()
在数据框中创建多个新列。应动态生成列名及其内容。
虹膜数据示例:
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)
}
但是,由于变异体认为varname是文字变量名,所以循环只创建一个新变量(称为varname),而不是四个(称为petal.2-petal.5)。
如何才能使mutate()
将我的动态名称用作变量名?
推荐答案
因为您是将变量名动态构建为字符值,所以使用标准数据进行赋值更有意义。框架索引允许列名使用字符值。例如:
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
的旧版本中也可能出现这种情况。需要谨慎使用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)
}
这篇关于对`dplyr`中的新列/变量使用动态名称的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!
查看全文