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

如何在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")

运行后得到的结果就是:

idkpivalue
bfte3
bfte5

方法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)

得到的结果会是每个组合的汇总数据:

idkpivalue
arev450
brev50
drev70
bfte8
cfte8
dfte9
efte3

方法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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 06:21:21