dplyr循环中引用变量名报错,寻求解决方案
解决dplyr动态列名分组报错问题
错误原因
你写的group_by(variable)里,variable是一个字符串变量,但dplyr会直接把它当作数据框的列名去查找——而你的数据集里根本没有叫variable的列,所以触发了找不到列的错误。
解决方案
这里提供三种可行的处理方式:
方法1:使用.data代词(dplyr内置)
用.data[[variable]]指定要引用的列,告诉dplyr从数据框里提取对应字符串名称的列:
library(dplyr) indic___1 <- c(0, 1, 0, 1, 0) indic___2 <- c(1, 1, 0, 1, 1) indic___3 <- c(0, 0, 1, 0, 0) indic___4 <- c(1, 1, 0, 1, 0) indic___5 <- c(0, 0, 0, 1, 1) indic___6 <- c(0, 1, 1, 1, 0) indic___7 <- c(1, 1, 0, 1, 1) indic___8 <- c(0, 1, 1, 1, 0) measure <- c(28, 15, 26, 42, 12) dataset <- data.frame(indic___1, indic___2, indic___3, indic___4, indic___5, indic___6, indic___7, indic___8, measure) for (i in 1:8) { variable <- paste0("indic___", i) print(variable) # 使用.data[[variable]]引用动态列名 result <- dataset %>% group_by(.data[[variable]]) %>% summarise(mean_measure = mean(measure)) print(result) }
方法2:使用rlang包的符号注入
先把字符串转换成符号,再用!!注入到分组表达式中:
library(dplyr) library(rlang) # 数据定义部分同上,省略重复代码 dataset <- data.frame(indic___1, indic___2, indic___3, indic___4, indic___5, indic___6, indic___7, indic___8, measure) for (i in 1:8) { # 把字符串转为符号 variable <- sym(paste0("indic___", i)) print(variable) result <- dataset %>% group_by(!!variable) %>% summarise(mean_measure = mean(measure)) print(result) }
方法3:转长格式一次性计算(更高效)
不用循环,直接把宽格式数据转成长格式,一次性统计所有指标的分组均值:
library(dplyr) library(tidyr) # 数据定义部分同上,省略重复代码 dataset <- data.frame(indic___1, indic___2, indic___3, indic___4, indic___5, indic___6, indic___7, indic___8, measure) dataset %>% # 把所有indic___开头的列转成长格式 pivot_longer(cols = starts_with("indic___"), names_to = "indicator", values_to = "group_value") %>% # 按指标名称和分组值分组统计 group_by(indicator, group_value) %>% summarise(mean_measure = mean(measure), .groups = "drop")
这种方式输出的结果更规整,也避免了循环的冗余代码。
内容的提问来源于stack exchange,提问作者DrNumeri
相关产品推荐
相关产品推荐

