基于变量名用循环筛选数据集时结果为空的问题排查
问题排查:循环中data_subset为空的原因及解决办法
核心原因
循环里的i是字符串类型(比如"assault"),直接在subset()中写i == 1时,R会将i当作字面量字符串处理,实际执行的是判断字符串"assault"是否等于数值1——这一比较结果永远为FALSE,因此筛选不到任何行,data_subset自然为空。
修正方案
你需要让R把字符串i解析为数据框master对应的列名,有两种常用方法:
方法1:使用get()函数获取列值
varlist <- c('assault', 'asthma', 'copd', 'diabetes', 'falls', 'pneumonia') for (i in varlist){ # 通过get(i)调用对应列,再筛选值为1的行 data_subset <- subset(master, get(i) == 1) tbl_i <- as.data.frame(xtabs(~ age_cat + indicator, data = data_subset)) # 注意:这里要用变量i而非字符串"i",否则工作表名和文件名会固定为"i" writeData(wb, i, tbl_i, startRow = 1, startCol = 1) # 生成首字母大写的文件名(和你的示例保持一致) filename <- paste0(toupper(substr(i, 1, 1)), substr(i, 2, nchar(i)), ".xlsx") saveWorkbook(wb, file = filename, overwrite = TRUE) }
方法2:使用数据框索引[[直接取列
varlist <- c('assault', 'asthma', 'copd', 'diabetes', 'falls', 'pneumonia') for (i in varlist){ # 用master[[i]]直接定位列,筛选值为1的行 data_subset <- master[master[[i]] == 1, ] tbl_i <- as.data.frame(xtabs(~ age_cat + indicator, data = data_subset)) writeData(wb, i, tbl_i, startRow = 1, startCol = 1) filename <- paste0(toupper(substr(i, 1, 1)), substr(i, 2, nchar(i)), ".xlsx") saveWorkbook(wb, file = filename, overwrite = TRUE) }
额外提示
原代码中writeData(wb, "i", ...)和saveWorkbook(..., "i.xlsx")的写法也有问题:这里的"i"是固定字符串,而非循环变量,修正后改用变量i可以生成对应名称的工作表和文件。
内容的提问来源于stack exchange,提问作者kevin_kwan
相关产品推荐
相关产品推荐

