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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.14 06:31:52