在R语言中按多列分组并统计指定值的出现次数
在R中按前三列分组统计第四列"Yes"的次数
嗨,这个需求在R里有好几种实用的实现方式,我给你整理了几个最常用的方案,你可以根据自己的习惯选择:
方法1:使用dplyr包(tidyverse生态,简洁直观)
这是现在R数据分析中最流行的方式,代码可读性很强:
首先确保你安装并加载了dplyr包:
install.packages("dplyr") # 如果没安装的话 library(dplyr)
假设你的数据框叫df,前三列是col1、col2、col3,第四列是col4,那么代码如下:
result_df <- df %>% group_by(col1, col2, col3) %>% summarize(yes_count = sum(col4 == "Yes", na.rm = TRUE), .groups = "drop")
group_by(col1, col2, col3):按前三列完成分组sum(col4 == "Yes"):统计每组中第四列等于"Yes"的次数,na.rm = TRUE是为了处理第四列可能存在的缺失值.groups = "drop":分组后取消分组状态,得到普通的数据框格式
方法2:基础R的aggregate函数(无需额外安装包)
如果你不想加载第三方包,用基础R自带的aggregate函数就能搞定:
result_df <- aggregate(col4 ~ col1 + col2 + col3, data = df, FUN = function(x) sum(x == "Yes", na.rm = TRUE)) # 可以给结果列重命名更直观 colnames(result_df)[4] <- "yes_count"
方法3:使用data.table包(适合大数据,效率极高)
如果你的数据量很大,data.table的运行速度会比前两种方案快很多:
install.packages("data.table") # 如果没安装的话 library(data.table) setDT(df) # 将普通数据框转为data.table格式 result_df <- df[, .(yes_count = sum(col4 == "Yes", na.rm = TRUE)), by = .(col1, col2, col3)]
示例测试
你可以用下面的示例数据试试上面的代码,看看结果是否符合预期:
# 构造示例数据框 df <- data.frame( col1 = c("A", "A", "B", "B", "A"), col2 = c("X", "X", "Y", "Y", "X"), col3 = c(1, 1, 2, 2, 1), col4 = c("Yes", "No", "Yes", "Yes", "Yes") )
运行后得到的result_df应该是:
| col1 | col2 | col3 | yes_count |
|---|---|---|---|
| A | X | 1 | 2 |
| B | Y | 2 | 2 |
内容的提问来源于stack exchange,提问作者nir020
相关产品推荐
相关产品推荐

