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

如何在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.12 23:35:52