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

如何在R中同时统计多列的0、1及NA响应次数?

在R中统计问卷各列的0/1/NA响应次数

问题背景

我需要统计问卷数据中每列的0、1、NA响应次数,但尝试的代码都在统计行组合的出现次数,无法得到目标格式。

数据与尝试过程

我的数据:

df <- read.table(text = " A  B  C
0   NA   1
1   0   NA
0   1   0
NA  NA  1
0   0   1
1   0   NA
0   1   NA ", header = TRUE)

我试过以下代码:

df %>%
  group_by(A, B, C)%>% 
  summarise(count = n())

以及count(A, B, C),得到的结果是各列值组合的出现次数:

A  B  C  n
0  0  1  1
0  1  0  1
0  1  NA 1
0  NA 1  1 
1  0  NA 2
NA NA 1  1

期望输出

我需要的是按列统计0、1、NA的总次数,格式如下:

Response 0 1 NA
Column A 4 2 1
Column B 3 2 2
Column C 1 3 3

解决方案

方法1:tidyverse工具链(推荐)

通过宽表转长表统计,再转回宽表的思路实现:

library(tidyverse)

df %>%
  # 将所有列转为长格式:列名存为Column,对应值存为Response
  pivot_longer(everything(), names_to = "Column", values_to = "Response") %>%
  # 统计每个列下各响应值的出现次数
  count(Column, Response) %>%
  # 转回宽格式,缺失的计数用0填充
  pivot_wider(names_from = Response, values_from = n, values_fill = 0) %>%
  # 调整列名格式以匹配期望输出
  mutate(Column = paste0("Column ", Column)) %>%
  rename(Response = Column)

方法2:Base R实现

无需加载第三方包,用lapply结合table处理:

# 遍历每列,统计0/1/NA的次数(useNA="always"强制统计NA)
col_counts <- lapply(df, function(x) table(x, useNA = "always"))

# 合并结果为数据框并调整格式
result <- as.data.frame(do.call(rbind, col_counts))
result$Response <- paste0("Column ", rownames(result))
# 调整列顺序,匹配期望输出
result <- result[, c(4, 1, 2, 3)]
rownames(result) <- NULL

print(result)

方法3:janitor包简化操作

janitor的tabyl函数专门用于这类频次统计:

library(janitor)

df %>%
  # 对每列生成频次表,合并为数据框
  map_dfr(tabyl, useNA = "always", .id = "Response") %>%
  # 调整列名格式
  mutate(Response = paste0("Column ", Response)) %>%
  # 选择并调整列顺序,重命名NA列
  select(Response, `0`, `1`, `<NA>`) %>%
  rename(NA = `<NA>`)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.23 10:48:21