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

R语言:按ID分组,含Event则留对应行,否则留最新日期行

R语言按规则筛选ID对应行

原始数据

data <- structure(
  list(
    ID = c(1, 1, 1, 2, 2, 3, 3, 3, 4, 4, 4, 4), 
    Event = c(1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0), 
    Date = c("12-24-2019", "12-25-2019",  "12-26-2019", "12-27-2019", "12-28-2019", "12-29-2019", "12-30-2019",  "12-31-2019", "12-01-2019", "12-02-2019", "12-03-2019", "12-04-2019")
  ), class = "data.frame", row.names = c(NA, -12L))

筛选规则

  • 若ID对应的行中存在Event=1的记录,保留该Event对应的Date行,删除同ID其他行
  • 若ID所有行的Event均为0,则保留该ID对应的最新Date行,删除其他行

解决方案

方法一:使用dplyr包(代码易读,适合新手)

先安装并加载dplyr包(首次使用需安装):

install.packages("dplyr")
library(dplyr)

处理数据:

data_clean <- data %>%
  # 将字符型Date转为日期格式,方便比较先后
  mutate(Date = as.Date(Date, format = "%m-%d-%Y")) %>%
  # 按ID分组
  group_by(ID) %>%
  # 按规则筛选:优先留Event=1的行;无Event=1则留日期最新的行
  filter(Event == 1 | (all(Event == 0) & Date == max(Date))) %>%
  # 取消分组
  ungroup()

# 查看处理后的数据
print(data_clean)

方法二:使用基础R(无需额外安装包)

# 先转换日期格式
data$Date <- as.Date(data$Date, format = "%m-%d-%Y")

# 按ID拆分数据,逐个处理后合并
data_clean <- do.call(rbind, lapply(split(data, data$ID), function(group) {
  # 检查当前ID是否有Event=1的行
  event_row <- group[group$Event == 1, ]
  if (nrow(event_row) > 0) {
    return(event_row)
  } else {
    # 取当前ID中日期最新的行
    return(group[group$Date == max(group$Date), ])
  }
}))

# 重置行名
rownames(data_clean) <- NULL

# 查看结果
print(data_clean)

内容的提问来源于stack exchange,提问作者sirius

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.07 18:12:46