R语言中如何使用存储列名的变量执行group_by分组操作
问题复现
运行以下代码时,直接传入裸列名可正常完成分组,将列名存入变量后传入会报找不到列的错误:
library(tidyverse) # 直接指定列名,运行正常 iris %>% group_by(Species) # 列名存入变量后传入,触发报错 grouping <- "Species" iris %>% group_by(grouping)
触发的报错信息:
Error: Must group by variables found in
.data. Columngroupingis not found.
报错原因
dplyr系列函数默认使用数据掩码机制,传入的参数会优先被识别为数据框内部的列名,不会自动读取全局环境中变量存储的内容。上述代码中group_by()会直接在iris数据中查找名为grouping的列,找不到对应列就会抛出错误。
解决方案
根据使用场景选择对应写法即可:
- 字符串列名变量场景(最常用):用
all_of()包裹传入的变量,明确告知函数这是外部存储的列名。如果存在多个列名存为字符向量的情况,该写法同样适用。
注:如果不需要强制校验所有传入列名必须存在于数据中,可以把# 单分组变量 iris %>% group_by(all_of(grouping)) # 多分组变量示例 grouping_cols <- c("Species", "Petal.Width") iris %>% group_by(across(all_of(grouping_cols)))all_of()替换为any_of(),函数会自动忽略数据中不存在的列名,不会中断运行。 - 兼容代词写法:用
.data[[ ]]取字符串对应的列,适合需要固定从数据框取列的场景:iris %>% group_by(.data[[grouping]]) - 自定义函数传参场景:如果是自己封装函数、传入裸列名作为参数,用
{{ }}(拥抱运算符)包裹参数即可:# 自定义分组计数函数示例 group_count <- function(df, group_col) { df %>% group_by({{ group_col }}) %>% summarise(n = n()) } # 直接传裸列名可正常运行 group_count(iris, Species)
内容的提问来源于stack exchange,提问作者Basil
相关产品推荐
相关产品推荐

