R语言按id分组删除因子多水平首次出现后后续行的实现方法
R按分组保留首次b/c时间点及之前所有行的解决方案
核心思路
通过定位每个id下首次出现b/c的时间节点,保留所有时间小于等于该节点的行,自然兼容同时间点多条b/c记录的场景,同时满足无b/c记录的id全保留的规则。
实现代码
library(dplyr) dat_result <- dat %>% # 按id分组 group_by(id) %>% # 组内按时间排序,保证时间顺序正确 arrange(dt, .by_group = TRUE) %>% # 计算当前id首次出现b/c的时间,无对应记录时返回无穷大Inf mutate(first_bc_time = min(dt[ind %in% c("b", "c")], na.rm = TRUE)) %>% # 保留所有时间早于或等于首次b/c时间的行 filter(dt <= first_bc_time) %>% # 移除辅助计算列 select(-first_bc_time) %>% # 取消分组 ungroup()
逻辑验证
- 对于id=1:首次b/c时间为2017-07-01,仅保留该时间及之前的2行,删除7月4日的后续行,符合要求
- 对于id=3:首次b/c时间为2017-08-10,该时间点的b、c两行均被保留,删除8月15日的后续行,符合要求
- 对于无b/c记录的id=4、id=6:
min()对空集返回Inf,所有行均满足dt <= Inf,全部保留 - 对于仅含b的id=5:首次b/c时间就是该行的时间,该行被正常保留
运行上述代码得到的结果和你给出的期望输出dat2完全一致。
内容的提问来源于stack exchange,提问作者statsnstuff
相关产品推荐
相关产品推荐

