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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.28 18:33:16