R语言中按lapse、gone、active分组统计多列观测值计数
嘿,我来帮你搞定这个R语言的统计需求!你想要按lapse、gone、active的固定顺序,统计每一列里每个类别的观测数,最终得到指定的表格格式对吧?我给你两种实用的实现方式,都是R里常用的操作思路:
方法一:使用tidyverse工具链(dplyr+tidyr)
这个方法适合喜欢流式数据处理的同学,代码逻辑清晰,容易理解:
# 先加载需要的包(如果没安装的话先跑 install.packages("tidyverse")) library(dplyr) library(tidyr) # 你的原始数据集 df <- data.frame( v1 = c('lapse','gone','active','lapse','lapse','active','active','active','gone'), v2 = c('gone','gone','active','lapse','active','lapse','active','lapse','lapse'), v3 = c('gone','gone','gone','gone','active','active','lapse','lapse','lapse'), v4 = c('active','gone','lapse','gone','lapse','gone','lapse','active','lapse') ) # 核心处理步骤 result <- df %>% # 把宽格式数据转成长格式,方便统一分组统计 pivot_longer(cols = everything(), names_to = "column", values_to = "group") %>% # 按分组和列名统计数量 count(group, column) %>% # 把长格式转回宽格式,还原成你要的列布局 pivot_wider(names_from = column, values_from = n) %>% # 严格按照你指定的顺序排序分组(避免默认的字母序) arrange(factor(group, levels = c("lapse", "gone", "active"))) %>% # 添加你要的序号型group列 mutate(group = row_number()) # 查看结果 print(result)
运行后就能得到你想要的表格,这里用pivot_longer和pivot_wider做数据格式转换,确保统计逻辑统一,最后用factor指定分组顺序,避免出现字母序混乱的问题。
方法二:使用Base R(无需额外安装包)
如果你不想加载第三方包,用Base R也能轻松实现:
# 指定你需要的分组顺序 group_order <- c("lapse", "gone", "active") # 遍历每一列,统计各分组的数量 col_counts <- lapply(df, function(col) { # 用factor强制指定分组顺序,保证统计结果的顺序正确 table(factor(col, levels = group_order)) }) # 把各列的统计结果合并成数据框 result_base <- as.data.frame(do.call(cbind, col_counts)) # 添加序号型group列,并调整列顺序 result_base$group <- 1:nrow(result_base) result_base <- result_base[, c("group", names(df))] # 查看结果 print(result_base)
这个方法用lapply遍历所有列,table统计频次,factor固定分组顺序,最后调整列布局就能得到目标结果,完全不需要额外依赖。
两种方法运行后都会输出你期望的结果:
group v1 v2 v3 v4 1 1 3 4 3 4 2 2 2 2 4 3 3 3 4 3 2 2
内容的提问来源于stack exchange,提问作者nogbad
相关产品推荐
相关产品推荐

