R语言按分组删除首次出现yes前的no行的实现方法
R语言按组删除首次yes前的no行实现方法
核心逻辑是:按id分组后,计算每组内value == "yes"的累计和,累计和≥1的行即为首次出现yes及之后的所有行,直接过滤保留即可。
方法1:dplyr实现(适合常规数据量)
先加载dplyr包,再分组过滤:
library(dplyr) # 示例数据 DT <- data.frame(id = c(1,1,1,2,2,2,2,2,3,3,3,3,3,3), value = c("no","yes","yes","no","no","yes","yes","yes","no","yes","yes","yes","no","no")) result <- DT %>% group_by(id) %>% # 累计和为0代表还未出现过yes,直接过滤 filter(cumsum(value == "yes") >= 1) %>% ungroup()
运行后打印result即可得到你需要的输出。如果需要处理某组全为no的场景,可以调整过滤条件,比如要保留全no组就改成filter(cumsum(value == "yes") >= 1 | all(value == "no"))。
方法2:data.table实现(适合百万行以上的大数据量)
用data.table语法运算效率更高:
library(data.table) # 示例数据 DT <- data.frame(id = c(1,1,1,2,2,2,2,2,3,3,3,3,3,3), value = c("no","yes","yes","no","no","yes","yes","yes","no","yes","yes","yes","no","no")) setDT(DT) # 转换为data.table格式 result <- DT[, .SD[cumsum(value == "yes") >= 1], by = id]
内容的提问来源于stack exchange,提问作者berehan
相关产品推荐
相关产品推荐

