You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过循环批量生成分类变量的频率表?(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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.12 23:53:25