r - 将变量名称粘贴到 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"))
解决方案
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.
推荐阅读
- ios - 导出后未显示 Objective-C 框架文档注释
- python - 节点 gyp 重建失败:错误:命令失败:节点 gyp 重建
- angular - 从提供者将某个变量更改为 true
- python - 使用 Python 和 PDFMiner 解析在线 PDF 文件
- classification - 具有多种特征的分类?
- java - Scriptella 安装问题 - maxOS
- ruby-on-rails - 如何根据红宝石返回的结果数量循环
- python - 如何排列 !help 命令类别,使它们不按字母顺序排列?
- php - 未找到基表或视图 laravel 数据透视表
- c# - 在我的代码中使用 string.join 时我做错了什么?