如何在R语言中按两个条件对数据框进行分组或子集化
嗨,我来帮你搞定这个按两个条件处理数据的需求~先看你给出的这份包含公司ID、KPI类型和对应数值的数据,我们可以从子集化筛选和分组聚合两个场景来处理:
一、按双条件子集化数据
如果你想直接挑出符合特定id和kpi组合的行,比如要找id为"b"且kpi是"fte"的记录,有两种常用实现方式:
方法1:Base R 原生函数
用subset()函数直接指定筛选条件就行:
# 筛选id为"b"且kpi为"fte"的子集 target_subset <- subset(df, id == "b" & kpi == "fte")
运行后得到的结果就是:
| id | kpi | value |
|---|---|---|
| b | fte | 3 |
| b | fte | 5 |
方法2:Tidyverse(dplyr)风格
如果习惯用管道流的写法,用dplyr的filter()更直观:
library(dplyr) target_subset <- df %>% filter(id == "b" & kpi == "fte")
结果和上面完全一致,只是写法更简洁易读~
二、按双条件分组(并做聚合计算)
如果需要对每个id+kpi的组合做统计(比如求和、均值、计数),这时候就需要分组操作了:
方法1:Base R 原生聚合
用aggregate()函数可以快速实现分组统计,比如计算每个组合的value总和:
# 按id和kpi分组,计算value的总和 group_total <- aggregate(value ~ id + kpi, data = df, FUN = sum)
得到的结果会是每个组合的汇总数据:
| id | kpi | value |
|---|---|---|
| a | rev | 450 |
| b | rev | 50 |
| d | rev | 70 |
| b | fte | 8 |
| c | fte | 8 |
| d | fte | 9 |
| e | fte | 3 |
方法2:Tidyverse 多统计量聚合
如果想一次性计算多个统计指标(比如总和、均值、记录数),dplyr的group_by()+summarise()组合会更灵活:
group_stats <- df %>% group_by(id, kpi) %>% summarise( total_value = sum(value), # 组内总和 avg_value = mean(value), # 组内均值 record_count = n() # 组内记录数 ) %>% ungroup() # 取消分组状态,避免后续操作受影响
运行后你会得到每个id+kpi组合的完整统计结果,非常适合后续分析。
另外,如果只是想给原数据标记分组信息,或者做组内的逐行计算(比如累计求和),可以用mutate()代替summarise():
df_with_cumulative <- df %>% group_by(id, kpi) %>% mutate(cumulative_value = cumsum(value)) %>% # 组内累计求和 ungroup()
比如id为"a"且kpi为"rev"的三条记录,cumulative_value会依次是100、250、450,完美保留原数据结构的同时增加了分组计算结果~
内容的提问来源于stack exchange,提问作者Luna
相关产品推荐
相关产品推荐

