使用dplyr的pivot与count组合实现因子变量频次统计
问题:生成因子变量的类别计数统计表格
我有一个数据集,所有列均为具有相同水平的factor类型,行代表观测值。需要生成以因子变量为行、答案类别计数为列的统计表格。
示例数据集
rating <- c("yes", "no", "totally") coke<-factor(c('yes', "yes", NA, "no"), levels=rating) icecream<-factor(c("yes", "no", "totally", "no"),levels=rating) cookie<-factor(c("no", NA, "no","yes"),levels=rating) df<-tibble(coke,icecream,cookie)
数据集预览:
# A tibble: 4 × 3 coke icecream cookie <fct> <fct> <fct> 1 yes yes no 2 yes no NA 3 NA totally no 4 no no yes
期望输出
mat<-matrix(c(2,1,0,1,1,2,1,0,1,1,0,1),byrow=T, 3,4, dimnames=list(c("coke","icecream","cookie"), c("yes","no","totally",NA))) mat
输出结果:
yes no totally <NA> coke 2 1 0 1 icecream 1 2 1 0 cookie 1 1 0 1
当前实现方式
目前只能逐个变量统计,代码如下:
df %>% count(coke)%>% pivot_wider(names_from = coke, values_from = n)
批量实现方案
方法1:使用tidyverse工具链
通过宽表转长、统一计数再转回宽表的方式,批量处理所有变量:
library(tidyverse) df %>% # 将所有列转为长格式,区分变量名和响应值 pivot_longer(everything(), names_to = "variable", values_to = "response") %>% # 按变量和响应值统计次数 count(variable, response) %>% # 转回宽格式,缺失的计数用0填充 pivot_wider(names_from = response, values_from = n, values_fill = 0)
方法2:使用基础R实现
利用sapply遍历所有列,结合table统计类别(包含NA),最后转置结果:
# 遍历每列生成计数表,包含NA的统计 result_matrix <- sapply(df, function(col) table(col, useNA = "always")) # 转置矩阵,让变量作为行 t(result_matrix)
内容的提问来源于stack exchange,提问作者Gitta
相关产品推荐
相关产品推荐

