R语言如何为宽格式数据集制作多变量频数计数表
R宽格式数据集多变量频数计数表实现
针对宽格式下统计多变量不同取值出现次数的需求,可直接通过以下方案实现,无需提前转换为长格式数据集做额外适配。
示例数据构造
sample <- data.frame(id = c('a','b','c','d','e','f'), home = c(3,6,5,2,4,5), office = c(2,2,5,3,1,6), other = c(4,1,3,1,5,6))
数据说明:home/office/other列的数值代表对应类别在单个样本中的出现次数,id为样本唯一标识列,不参与频数统计。最终输出结果以类别变量为行名、频数值为列名,单元格值为对应类别下该频数值的样本数,无对应样本的位置填NA。
实现方案
方案1:基础R实现(无第三方包依赖)
核心逻辑是逐列对目标变量做频数统计,固定频数取值范围避免缺漏值,最后对齐合并为宽表即可。
# 指定需要统计的目标列 target_cols <- c("home", "office", "other") # 逐列计算频数,固定频数范围为1-6(可根据实际数据调整取值区间) freq_result <- lapply(sample[target_cols], function(col) { table(factor(col, levels = 1:6)) }) # 合并为数据框,将0次出现的位置替换为NA outcome <- as.data.frame(do.call(rbind, freq_result)) outcome[outcome == 0] <- NA # 设置列名为对应频数值 colnames(outcome) <- as.character(1:6)
运行输出结果:
X1 X2 X3 X4 X5 X6 home NA 1 1 1 2 1 office 1 2 1 NA 1 1 other 2 NA 1 1 1 1
注意:R默认会为纯数字开头的列名自动添加X前缀,属于正常语法规则,列X1即代表对应变量取值为1的样本出现次数。
方案2:tidyverse实现(适合管道流操作)
如果日常使用tidyverse生态处理数据,可通过长宽转换快速得到结果,代码可读性更强:
library(dplyr) library(tidyr) outcome <- sample %>% select(-id) %>% pivot_longer(cols = everything(), names_to = "category", values_to = "freq") %>% count(category, freq) %>% pivot_wider(names_from = freq, values_from = n, names_sort = TRUE) %>% tibble::column_to_rownames("category")
两种方案输出结果完全一致,可根据自己的使用习惯选择:
- 无R包使用基础时优先选方案1,复制即可运行
- 已有tidyverse使用经验时选方案2,方便后续衔接数据合并、可视化等流程
内容的提问来源于stack exchange,提问作者Brian_p
相关产品推荐
相关产品推荐

