【发布时间】:2020-09-30 15:03:00
【问题描述】:
我希望根据不同事件之间的几个条件和日期差异删除行,每个 ID。
我的数据是这样的
#dat
id name date
10 "BREEDING" 2019-05-17
10 "OTHER" 2020-01-01
11 "BREEDING" 2020-07-01
11 "GESTATION POSITIF" 2020-09-01
12 "BREEDING" 2020-06-26
12 "GESTATION NEGATIF" 2020-08-01
21 "OTHER" 2018-06-20
21 "GESTATION POSITIF" 2018-10-15
22 "BREEDING" 2020-08-07
22 "GESTATION POSITIF" 2020-09-11
根据 ID,我希望对于那些名为“BREEDING”和“GESTATION”的人(无论是正数还是负数)计算事件“GESTATION”和事件“育种”。
那么如果日期差为34、35、36,则删除对象dat内符合该条件的BREEDING行。
我有一个循环解决方案正在完成这项工作,但我想改进它。我做了几次尝试,但都没有成功。基本上我认为正确的代码应该是“像”这样的
dat %>%
group_by(id) %>%
grepl("GESTATION",name) %>% #keep ids with an event gestation recorded
grepl("BREEDING",name) %>% #keep ids with an event breeding recorded
mutate(new_var = "date GESTATION"-"date BREEDING") %>%#per ids, compute de difference of date beetween events gestation event and breeding
filter(!(new_var %in% c(34:36))) %>% #if an event of breeding happened 35 days before the gestation event, +/- 1 day, remove
ungroup()
最后我的结果应该是,对于这个例子,
#dat
id name date
10 "BREEDING" 2019-05-17
10 "OTHER" 2020-01-01
11 "BREEDING" 2020-07-01
11 "GESTATION POSITIF" 2020-09-01
12 "GESTATION NEGATIF" 2020-08-01
21 "OTHER" 2018-06-20
21 "GESTATION POSITIF" 2018-10-15
22 "GESTATION POSITIF" 2020-09-11
【问题讨论】:
-
某个id会不会有多个“BREEDING”和“GESTATION”?
-
@DarrenTsai 是的,这是可能的。