首页 > 解决方案 > 将变量名称粘贴到 mutate (dplyr)

问题描述

我尝试在 mutate_() 函数 (dplyr) 中使用 paste() 创建一个变量。

我尝试使用此答案(dplyr - mutate: use dynamic variable names)调整代码,但它不起作用......

注意:nameVarPeriod1 是函数的参数

nameVarPeriod1=A2
df <- df %>%
    group_by(segment) %>%
    mutate_((.dots=setNames(mean(paste0("Sum",nameVarPeriod1)), paste0("MeanSum",nameVarPeriod1))))

这会返回一个警告:

Warning message:
In mean.default(paste0("Sum", nameVarPeriod1)) :
  argument is not numeric or logical: returning NA

如何将 paste0 中的字符串评估为变量名?

当我用它替换 paste0 时,它工作正常:

df <- df %>%
    group_by(segment) %>%
    mutate(mean=mean(SumA2))

数据 :

structure(list(segment = structure(c(5L, 1L, 4L, 2L, 2L, 14L, 
11L, 6L, 14L, 1L), .Label = c("Seg1", "Seg2", "Seg3", "Seg4", 
"Seg5", "Seg6", "Seg7", "Seg8", "Seg9", "Seg10", "Seg11", "Seg12", 
"Seg13", "Seg14"), class = "factor"), SumA2 = c(107584.9, 127343.87, 
205809.54, 138453.4, 24603.46, 44444.39, 103672, 88695.8, 64400, 
36815.82)), .Names = c("segment", "SumA2"), row.names = c(NA, 
-10L), class = c("tbl_df", "tbl", "data.frame"))

标签: rdplyr

解决方案


dplyr 0.7.0以后不需要使用mutate_. 这是一个:=用于动态分配变量名和辅助函数的解决方案quo name

vignette("programming", "dplyr")阅读更多信息会很有帮助。另请参阅在 `dplyr` 中使用动态变量名称以了解旧版本的 dplyr。

df <- df %>%
  group_by(segment) %>%
  mutate( !!paste0('MeanSum',quo_name(nameVarPeriod1)) := 
mean(!!as.name(paste0('Sum',quo_name(nameVarPeriod1)))))

dplyr 1.0.0 替代方案:

使用中的新across函数,dplyr 1.0.0我们可以使用glue样式语法设置名称,并且可以将函数名称和原始列作为名称的一部分:

my_fn <- function(nameVarPeriod1 = 'A2'){
  col_list <- paste0('Sum',nameVarPeriod1)
  df %>% 
    group_by(segment) %>%
    mutate(across(col_list, list(mean=mean), .names = "{fn}{col}"))
}

my_fn()
#   segment   SumA2 meanSumA2
#   <fct>     <dbl>     <dbl>
# 1 Seg5    107585.   107585.
# 2 Seg1    127344.    82080.
# 3 Seg4    205810.   205810.
# 4 Seg2    138453.    81528.
# 5 Seg2     24603.    81528.
# 6 Seg14    44444.    54422.
# 7 Seg11   103672    103672 
# 8 Seg6     88696.    88696.
# 9 Seg14    64400     54422.
#10 Seg1     36816.    82080.

推荐阅读