如何按nest分组移除满足avg相等条件的Class_50行?
按分组条件过滤数据行
示例数据集
# Data set nest <- c(2,2,2,2,2,2,3,3,3,3,3,3) ClassType <- c("Class_0_1","Class_1_3","Class_3_9","Class_9_25","Class_25_50", "Class_50","Class_0_1","Class_1_3","Class_3_9","Class_9_25","Class_25_50","Class_50") avg <- c(19.0,19.0,19.0,19.0,19.0,19.0,0.776,0.776,0.776,12.4,22.3,36.0) ds <- data.frame(nest,ClassType,avg)
数据集结构:
str(ds) # 'data.frame': 12 obs. of 3 variables: # $ nest : num 2 2 2 2 2 2 3 3 3 3 ... # $ ClassType: chr "Class_0_1" "Class_1_3" "Class_3_9" "Class_9_25" ... # $ avg : num 19 19 19 19 19 19 0.776 0.776 0.776 12.4 ...
需求
按nest变量分组,若同组内ClassType为"Class_25_50"和"Class_50"的avg值相等,移除ClassType为"Class_50"的行。
实现方案
方案1:使用dplyr包(tidyverse生态)
先安装并加载dplyr:
install.packages("dplyr") library(dplyr)
执行过滤逻辑:
filtered_ds <- ds %>% group_by(nest) %>% # 保留非Class_50的行,或Class_50但与同组Class_25_50的avg不等的行 filter(!(ClassType == "Class_50" && avg == avg[ClassType == "Class_25_50"])) %>% ungroup() # 查看结果 print(filtered_ds, row.names = TRUE)
方案2:使用Base R(无需额外安装包)
# 按nest拆分数据集,逐组处理后合并 filtered_ds <- do.call(rbind, lapply(split(ds, ds$nest), function(group) { # 提取两个目标类别的avg值 val_25_50 <- group$avg[group$ClassType == "Class_25_50"] val_50 <- group$avg[group$ClassType == "Class_50"] # 若两个值存在且相等,移除Class_50的行 if (length(val_25_50) > 0 && length(val_50) > 0 && val_25_50 == val_50) { group <- group[group$ClassType != "Class_50", ] } return(group) })) # 重置行名 row.names(filtered_ds) <- seq(nrow(filtered_ds)) # 查看结果 print(filtered_ds)
最终输出
# nest ClassType avg # 1 2 Class_0_1 19.000 # 2 2 Class_1_3 19.000 # 3 2 Class_3_9 19.000 # 4 2 Class_9_25 19.000 # 5 2 Class_25_50 19.000 # 6 3 Class_0_1 0.776 # 7 3 Class_1_3 0.776 # 8 3 Class_3_9 0.776 # 9 3 Class_9_25 12.400 # 10 3 Class_25_50 22.300 # 11 3 Class_50 36.000
内容的提问来源于stack exchange,提问作者Leprechault
相关产品推荐
相关产品推荐

