R语言循环列名并为dplyr汇总表添加列名的问题求助
问题与解决方法
问题背景
需要循环处理Sex、Smoke、Diabetes、HIV这几列,为每列的每个因子水平生成Age的均值和标准差汇总表,同时将原列名添加到汇总表中。使用assign生成对应变量(mean_Sex、mean_Smoke等)时出现错误。
原代码
for(var in c("Sex", "Smoke", "Diabetes", "HIV")) { assign(paste0("mean_",var))<-df%>%group_by(var) %>% summarise(meanAge=mean(Age), sdAge=sd(Age)) }
错误信息
Error in
group_by_prepare():
! Must group by variables found in.data.
- Column
varis not found.
Runrlang::last_error()to see where the error occurred.
数据示例
structure(list(ID = c(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12), Sex = structure(c(2L, 2L, 2L, 1L, 1L, 2L, 1L, 2L, 1L, 2L, 2L, 1L), .Label = c("F", "M"), class = "factor"), Smoke = structure(c(3L, 1L, 1L, 3L, 2L, 2L, 2L, 3L, 3L, 1L, 1L, 3L), .Label = c("N", "NA", "Y"), class = "factor"), Diabetes = structure(c(3L, 1L, 3L, 3L, 2L, 3L, 3L, 1L, 1L, 2L, 2L, 2L), .Label = c("N", "NA", "Y"), class = "factor"), HIV = structure(c(1L, 1L, 2L, 3L, 3L, 3L, 3L, 2L, 1L, 1L, 2L, 1L), .Label = c("N", "NA", "Y"), class = "factor"), Age = c(23, 24, 43, 35, 18, 29, 25, 17, 22, 20, 55, 54)), row.names = c(NA, -12L), class = c("tbl_df", "tbl", "data.frame"))
错误原因
group_by(var)中的var是字符串,dplyr会直接将其作为列名查找,但数据中不存在名为var的列,因此报错。同时原代码中assign的语法错误,正确写法应为assign(变量名, 赋值内容)。
解决方法
方法1:修正循环+assign生成独立变量
使用sym()和!!将字符串转换为dplyr可识别的变量,同时添加原列名到汇总表中:
library(dplyr) for(var in c("Sex", "Smoke", "Diabetes", "HIV")) { # 生成带原列名标识的汇总表 summary_table <- df %>% group_by(!!sym(var)) %>% # 将字符串转为dplyr变量 summarise(meanAge = mean(Age), sdAge = sd(Age), .groups = "drop") %>% # 取消分组状态 rename(group_level = !!sym(var)) %>% # 统一分组列名(可选) mutate(group_column = var) # 添加原列名标识 # 赋值到全局环境,生成mean_Sex等变量 assign(paste0("mean_", var), summary_table) }
执行后直接调用mean_Sex即可查看对应汇总表,表中包含分组水平、Age均值、标准差及原列名。
方法2:更推荐——用列表存储所有结果
避免生成大量独立变量污染全局环境,将所有汇总表存储在一个列表中,管理更方便:
library(dplyr) group_columns <- c("Sex", "Smoke", "Diabetes", "HIV") # 生成汇总表列表 summary_list <- lapply(group_columns, function(var) { df %>% group_by(!!sym(var)) %>% summarise(meanAge = mean(Age), sdAge = sd(Age), .groups = "drop") %>% rename(group_level = !!sym(var)) %>% mutate(group_column = var) }) # 给列表元素命名,方便查找 names(summary_list) <- paste0("mean_", group_columns) # 查看单个结果示例 summary_list$mean_Sex
内容的提问来源于stack exchange,提问作者Statistix
相关产品推荐
相关产品推荐

