如何用R循环批量生成带行百分比的交叉表?
批量生成带行百分比的交叉表解决方案
不用重复写三次代码,用tidyverse可以轻松批量处理var1、var2、var3三个变量,这里提供两种高效实现方式:
方法一:用purrr::map遍历变量名
先定义要处理的变量列表,再循环代入你的交叉表逻辑:
library(tidyverse) # 指定要处理的变量 target_vars <- c("var1", "var2", "var3") # 批量生成交叉表,每个变量对应一个结果表 cross_table_list <- map(target_vars, function(current_var) { df_example %>% group_by(country) %>% count(.data[[current_var]], wt = weight) %>% arrange(.data[[current_var]]) %>% mutate(pctg = round(n/sum(n), 4)) %>% select(-n) %>% pivot_wider(names_from = all_of(current_var), values_from = pctg) %>% mutate(source_var = current_var) # 标记该表对应的原变量 }) # 可选:把所有表合并成一个数据框 combined_result <- bind_rows(cross_table_list)
.data[[current_var]]用来动态引用循环中的变量名- 添加
source_var列可以区分不同变量的结果,方便后续查看或筛选
方法二:先转长格式再批量处理
这种方式代码更紧凑,一次性生成所有变量的交叉表:
df_example %>% # 只保留需要的列 select(country, starts_with("var"), weight) %>% # 把var1-var3转成长格式:变量名+对应值 pivot_longer(cols = starts_with("var"), names_to = "source_var", values_to = "response") %>% # 按变量和国家分组计算 group_by(source_var, country) %>% count(response, wt = weight) %>% mutate(pctg = round(n/sum(n), 4)) %>% select(-n) %>% # 转回宽格式得到交叉表 pivot_wider(names_from = response, values_from = pctg)
这种方法直接输出按source_var分组的所有结果,无需额外合并步骤,适合快速查看所有变量的行百分比分布。
内容的提问来源于stack exchange,提问作者C More
相关产品推荐
相关产品推荐

