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

R实现dataframe每列因子水平计数:问卷yes/no/NA统计方法问询

实现方案

你可以配合使用dplyr和tidyr的长宽表转换函数实现需求,示例代码如下:

步骤1:构造示例数据(你可以跳过这步直接用自己的数据集)

library(tidyverse)

# 构造符合你描述的factor类型数据集
df <- tibble(
  Q_1 = factor(c(1,2,1,2), levels = c(1,2)),
  Q_2 = factor(c(1,1,2,1), levels = c(1,2)),
  Q_3 = factor(c(1,1,NA,2), levels = c(1,2))
)

步骤2:核心统计代码

result <- df %>%
  # 把所有题目列转为长表,新增question存题目名、answer存对应答案
  pivot_longer(cols = everything(), names_to = "question", values_to = "answer") %>%
  # 按题目+答案分组计数,`.drop = FALSE`保证所有因子水平都保留,计数为0也不会丢失
  count(question, answer, .drop = FALSE) %>%
  # 把答案值替换为你需要的命名,NA单独归类
  mutate(answer = case_when(
    answer == 1 ~ "Yes",
    answer == 2 ~ "No",
    is.na(answer) ~ "NA"
  )) %>%
  # 转回宽表得到最终汇总结果
  pivot_wider(names_from = answer, values_from = n)

运行后result的输出完全符合你的预期:

# A tibble: 3 × 4
  question   Yes    No  `NA`
  <chr>    <int> <int> <int>
1 Q_1          2     2     0
2 Q_2          3     1     0
3 Q_3          2     1     1

基础R快速实现方案

如果你不想加载tidyverse包,也可以用基础R的apply函数实现:

result <- as.data.frame(t(apply(df, 2, function(col) {
  c(
    Yes = sum(col == 1, na.rm = TRUE),
    No = sum(col == 2, na.rm = TRUE),
    `NA` = sum(is.na(col))
  )
})))

内容的提问来源于stack exchange,提问作者Rasul89

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.03 19:18:02