如何用循环或lapply调用R语言freq_table()生成多变量频数表?
批量生成带置信区间的频数表(freq_table() 适配)
问题
需要为多个分类变量批量调用freq_table()生成带95% logit置信区间的频数表,手动实现可行,但循环/lapply尝试报错。手动代码:
data(mtcars) freq_table_am <- freq_table(mtcars, am, percent_ci = 95, ci_type = "logit", drop = FALSE) freq_table_gear <- freq_table(mtcars, gear, percent_ci = 95, ci_type = "logit", drop = FALSE) freq_tables <- rbind(freq_table_am, freq_table_gear) freq_tables
失败的循环尝试(报错:语法错误或找不到列):
vars<- c('am', 'gear') # 尝试1:语法错误 for(i in vars) { freq_table(community_survey, [i], percent_ci = 95, ci_type = "logit", drop = FALSE) } # 尝试2:找不到列"i" for(i in vars) { freq_table(community_survey, i, percent_ci = 95, ci_type = "logit", drop = FALSE) }
解决方法
1. 使用lapply批量处理
freq_table()采用非标准求值,需用.data代词引用字符串列名:
library(epitools) # 假设freq_table来自epitools包 vars <- c('am', 'gear') # 批量生成频数表列表 freq_list <- lapply(vars, function(col) { freq_table(mtcars, .data[[col]], percent_ci = 95, ci_type = "logit", drop = FALSE) }) # 合并所有结果 freq_tables <- do.call(rbind, freq_list) freq_tables
2. 修正for循环
同样用.data代词解决列引用问题:
vars <- c('am', 'gear') freq_list <- list() for(col in vars) { freq_list[[col]] <- freq_table(mtcars, .data[[col]], percent_ci = 95, ci_type = "logit", drop = FALSE) } freq_tables <- do.call(rbind, freq_list) freq_tables
替代函数
如果freq_table()的批量适配仍有问题,可选择这些支持置信区间的工具:
gmodels::CrossTable():直接生成带置信区间的频数表,循环调用即可janitor::tabyl()+binom::binom.confint():先生成基础频数表,再批量计算并合并置信区间,灵活性更强epitools::binom.exact():单独计算二项分布置信区间,搭配dplyr可批量处理多变量
内容的提问来源于stack exchange,提问作者Shannon
相关产品推荐
相关产品推荐

