如何在R语言中按id的event存在性规则过滤数据框
解决方案
可以通过分组判断+筛选的方式实现需求,下面提供两种常用的R语言实现方法:
方法一:使用dplyr(tidyverse生态)
这是最直观的分组处理方式,利用分组函数结合条件筛选完成需求:
library(dplyr) data <- data.frame(id=c(1,1,1,2,2,2,3,3,3), event=c(1,0,1,0,0,1,0,0,0)) result <- data %>% group_by(id) %>% filter(if (any(event == 1)) event == 1 else TRUE) %>% ungroup() print(result)
代码解释:
group_by(id):按个人编号id对数据分组filter(if (any(event == 1)) event == 1 else TRUE):对每个分组执行判断逻辑:- 若分组内存在至少一个
event=1,则只保留该分组中event=1的行 - 若分组内所有
event均为0,则保留该分组的全部行
- 若分组内存在至少一个
ungroup():取消分组格式,返回普通数据框
方法二:使用Base R
无需加载额外扩展包,通过基础函数生成分组标记后完成筛选:
data <- data.frame(id=c(1,1,1,2,2,2,3,3,3), event=c(1,0,1,0,0,1,0,0,0)) # 生成每个id的标记:1代表该id存在event=1,0代表无 has_event <- ave(data$event, data$id, FUN = function(x) any(x == 1)) # 按条件筛选行:有event的id只留event=1的行,无event的id留全部行 result <- data[(has_event == 1 & data$event == 1) | has_event == 0, ] print(result)
代码解释:
ave(data$event, data$id, FUN = function(x) any(x == 1)):按id分组,为每个组生成是否存在event=1的标记,返回与原数据等长的向量- 筛选逻辑用
|(或)连接两个条件:一是有event的id中event=1的行,二是无event的id的所有行
两种方法运行后均会输出目标结果:
> print(result) id event 1 1 1 3 1 1 6 2 1 7 3 0 8 3 0 9 3 0
内容的提问来源于stack exchange,提问作者Lee
相关产品推荐
相关产品推荐

