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

