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

如何按id1分组筛选measure列差值≥2的数据框行

实现按分组筛选行:保留组内measure差值≥2的行

这是个很典型的分组筛选需求,我给你两种实用的R语言实现方法,都能精准得到你想要的结果:

方法一:使用dplyr包(tidyverse风格)

如果你平时习惯用tidyverse工具链,这种方法代码简洁易读,逻辑清晰:

# 先加载dplyr包(如果没安装先运行install.packages("dplyr"))
library(dplyr)

# 定义你的测试数据
test <- data.frame(measure = c(1, 2, 3, 2, 2, 4, 0, 1), 
                   id1 = c("A", "B", "A", "B", "C", "C", "A", "D"), 
                   id2 = c("16", "16", "16", "16", "17", "17", "17", "18"))

# 执行筛选逻辑
res <- test %>%
  group_by(id1) %>%  # 按id1分组
  filter(max(measure) - min(measure) >= 2) %>%  # 筛选出组内measure最大最小值差≥2的组
  ungroup()  # 取消分组(避免后续操作受分组状态影响)

# 查看结果
res

运行这段代码后,就会得到你期望的结果:id1为B和D的组因为差值不足2被移除,剩下的A、C组的所有行都被保留。

方法二:使用Base R(无需额外包)

如果不想加载第三方包,用Base R也能轻松实现:

# 定义测试数据
test <- data.frame(measure = c(1, 2, 3, 2, 2, 4, 0, 1), 
                   id1 = c("A", "B", "A", "B", "C", "C", "A", "D"), 
                   id2 = c("16", "16", "16", "16", "17", "17", "17", "18"))

# 第一步:计算每个id1组的measure最大最小值差
group_diff <- tapply(test$measure, test$id1, function(x) max(x) - min(x))

# 第二步:筛选出差值≥2的有效id1
valid_ids <- names(group_diff[group_diff >= 2])

# 第三步:从原数据中保留id1属于有效列表的行
res_base <- test[test$id1 %in% valid_ids, ]

# 查看结果
res_base

这个方法的逻辑是先提前算出每个分组的差值,再找出符合条件的分组ID,最后过滤原数据,结果和第一种方法完全一致。

两种方法都能满足你的需求,你可以根据自己的习惯选择~

内容的提问来源于stack exchange,提问作者DR15

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.01 03:13:12