如何通过循环批量生成分类变量的频率表?(R语言)
批量生成分类变量频率表问题解决
我需要为多个分类变量生成频率表,目前使用questionr包中的freq函数,数据框名为esp。我创建了包含变量名的对象:
symp <- c("asthma", "flu", "cough", "sivilance", "fever")
尝试用foreach批量处理:
library(foreach) foreach(esp[symp]) %do% questionr::freq(i, cum = TRUE, total = TRUE, na.last = T)
但返回的结果都是相同的单一值频率表(如下),显然不符合预期,需要不重复代码实现批量制表。
[[1]] n % val% %cum val%cum 3 1 100 100 100 100 Total 1 100 100 100 100 [[2]] n % val% %cum val%cum 3 1 100 100 100 100 Total 1 100 100 100 100 ...
问题原因
原代码的核心问题是循环逻辑错误:foreach(esp[symp])直接循环数据框的列,但未正确引用循环变量,且函数内的i未定义,导致freq函数没有接收到正确的变量数据。
解决方案
方法1:修正foreach用法
明确循环symp中的变量名,提取数据框对应列进行处理,同时给结果列表命名方便识别:
library(foreach) library(questionr) # 循环变量为symp中的变量名,指定结果名称与变量名一致 freq_list <- foreach(var = symp, .names = symp) %do% { freq(esp[[var]], cum = TRUE, total = TRUE, na.last = TRUE) } # 直接通过变量名访问对应频率表 freq_list$asthma freq_list$flu
方法2:用lapply实现更简洁
如果不需要并行处理,lapply是更轻量的选择,代码更简洁:
library(questionr) # 遍历symp中的变量名,生成对应频率表 freq_list <- lapply(symp, function(var) { freq(esp[[var]], cum = TRUE, total = TRUE, na.last = TRUE) }) # 为列表元素命名,便于查找 names(freq_list) <- symp
两种方法都通过esp[[var]]正确提取每个变量的完整数据,确保freq函数生成对应变量的真实频率分布,同时命名后的列表让你能快速定位到目标变量的结果。
内容的提问来源于stack exchange,提问作者DavidMB
相关产品推荐
相关产品推荐

