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
相关产品推荐
相关产品推荐

