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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.29 17:24:20