R语言:如何合并多变量频率表,将8个变量转为行、4个因子水平为列
合并因子变量频率表的实现方法
现有数据集provasubset,包含Organismo列与8个以compliment_perc_index_bloc_*命名的因子列,每个因子预设4个水平(部分变量存在水平缺失)。需要将各因子的频率表合并为统一表格:行对应变量名,列对应4个因子水平,单元格为对应水平下的Organismo数量。
方法一:Base R实现(无需额外包)
# 提取所有目标因子列 factor_cols <- grep("^compliment_perc_index_bloc_", names(provasubset), value = TRUE) # 定义所有预设的因子水平 all_levels <- c("Menys del 25%", "Entre un 25% i un 50%", "Entre un 50% i un 75%", "Més del 75%") # 遍历生成每个变量的频率表,并补全缺失水平(填充0) freq_list <- lapply(factor_cols, function(col) { # 生成单变量频率表 tbl <- table(provasubset[[col]]) # 创建包含所有水平的空容器,缺失水平赋值0 full_tbl <- setNames(numeric(length(all_levels)), all_levels) full_tbl[names(tbl)] <- tbl # 转置为行格式,方便合并 as.data.frame(t(full_tbl), stringsAsFactors = FALSE) }) # 合并所有结果,添加变量名列并调整顺序 result_df <- do.call(rbind, freq_list) result_df$`Name variable` <- factor_cols result_df <- result_df[, c(ncol(result_df), 1:(ncol(result_df)-1))] # 输出结果 print(result_df)
方法二:Tidyverse实现(代码更直观)
需先加载tidyverse包:
library(tidyverse) # 定义所有预设因子水平 all_levels <- c("Menys del 25%", "Entre un 25% i un 50%", "Entre un 50% i un 75%", "Més del 75%") result_df <- provasubset %>% # 宽格式转长格式,拆分变量名与对应水平 pivot_longer(cols = starts_with("compliment_perc_index_bloc_"), names_to = "Name variable", values_to = "Level") %>% # 将Level转换为包含所有预设水平的因子,确保缺失水平被纳入统计 mutate(Level = factor(Level, levels = all_levels)) %>% # 按变量名和水平分组计数 group_by(`Name variable`, Level) %>% summarize(Count = n(), .groups = "drop") %>% # 长格式转回宽格式,缺失水平填充0 pivot_wider(names_from = Level, values_from = Count, values_fill = 0) # 输出结果 print(result_df)
两种方法均可生成符合需求的表格:Base R版本无需依赖第三方包,适合轻量场景;Tidyverse版本代码逻辑更清晰,便于后续维护和扩展。
内容的提问来源于stack exchange,提问作者FrancoBattiato
相关产品推荐
相关产品推荐

