对`dplyr`中的新列/变量使用动态名称 [英] Use dynamic name for new column/variable in `dplyr`

查看:17
本文介绍了对`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的旧版本中也可能出现这种情况。需要谨慎使用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)
}

这篇关于对`dplyr`中的新列/变量使用动态名称的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆