R语言:如何对各团队DataFrame应用多步过滤并汇总计数结果?
问题
我有一个大型DataFrame:
df <- data.frame(teams=sample(LETTERS,1000,replace=TRUE),type=sample(1:15,1000,replace=TRUE))
需要对每个团队应用一套包含多步骤、基于特定行序列的复杂过滤(原DataFrame含datetime字段,需使用lag和lead函数清洗结果,因此必须独立处理每个团队)。简化示例如下:
df1 <- df %>% filter(team == "A") result1 <- df1 %>% filter(type == 3 & type == 10) result2 <- df1 %>% filter(type == 6 & type == 12)
目标是对所有团队执行相同过滤逻辑,统计各结果的行数,并汇总成如下格式的DataFrame:
| Team | result1 | result2 |
|---|---|---|
| A | 12 | 6 |
| B | 8 | 2 |
| C | 50 | 10 |
解决方案
可以借助dplyr的分组机制,把每个团队的逻辑处理和统计整合到一起,无需单独拆分每个团队:
基础版(简单过滤条件)
library(dplyr) final_result <- df %>% group_by(teams) %>% summarise( result1 = sum(type == 3 & type == 10), # 统计符合result1条件的行数 result2 = sum(type == 6 & type == 12), # 统计符合result2条件的行数 .groups = "drop" # 取消分组,返回普通DataFrame ) # 查看结果 final_result
进阶版(含lag/lead等行顺序依赖逻辑)
如果你的实际过滤需要用到lag/lead这类依赖行顺序的操作,可以先在分组内完成数据清洗,再统计:
final_result <- df %>% group_by(teams) %>% # 先执行依赖行序列的清洗逻辑,以下为示例(替换成你的实际逻辑) mutate( # 示例:当前行type为3且下一行type为10 meets_result1 = type == 3 & lead(type) == 10, # 示例:当前行type为6且下一行type为12 meets_result2 = type == 6 & lead(type) == 12 ) %>% summarise( result1 = sum(meets_result1, na.rm = TRUE), # 统计符合条件的行数,忽略NA result2 = sum(meets_result2, na.rm = TRUE), .groups = "drop" )
运行后就能得到你需要的按团队汇总的统计结果,格式完全匹配要求。
内容的提问来源于stack exchange,提问作者Delopera
相关产品推荐
相关产品推荐

