按name匹配earliest_date删除晚于该日期的数据的R实现问题
解决方案
你可以直接在行级别做条件判断实现过滤,不需要使用固定日期参数。根据你的数据集实际情况可以选择以下两种实现:
情况1:所有带earliest_date的name对应行都已填充对应值
直接用dplyr的filter()做行级判断即可:
library(dplyr) result <- mydata %>% # 保留earliest_date为NA 或者 Date早于等于earliest_date的行 filter(is.na(earliest_date) | Date <= earliest_date)
用你提供的示例数据运行这段代码,就会直接删除第一行,得到符合要求的输出结果。
情况2:同一个name的earliest_date只在部分行填写,其余同name行该字段为NA
先按name分组补全所有行的对应最早日期,再做过滤:
library(dplyr) result <- mydata %>% group_by(name) %>% # 取当前name对应的非空最早日期补全到所有行 mutate(name_earliest = min(earliest_date, na.rm = TRUE)) %>% ungroup() %>% filter(is.na(name_earliest) | Date <= name_earliest) %>% # 移除辅助计算列 select(-name_earliest)
base R 实现(无需加载第三方包)
# 先提取每个name对应的最早日期 name_map <- aggregate(earliest_date ~ name, mydata, min, na.rm = TRUE, na.action = NULL) # 匹配到原数据集 mydata_merge <- merge(mydata, name_map, by = "name", suffixes = c("", "_min")) # 过滤符合要求的行 result <- mydata_merge[is.na(mydata_merge$earliest_date_min) | mydata_merge$Date <= mydata_merge$earliest_date_min, ] # 移除辅助列 result$earliest_date_min <- NULL
内容的提问来源于stack exchange,提问作者OMG C
相关产品推荐
相关产品推荐

