如何按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
相关产品推荐
相关产品推荐

