如何在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
相关产品推荐
相关产品推荐

