【发布时间】:2021-08-24 01:42:14
【问题描述】:
在此示例数据中:
id<-c(2,2,2,2,2,3,3,3,3,3,3,4,4,4,4)
time<-c(3,5,7,8,9,2,8,10,12,14,18,4,6,7,9)
status<-c('mar','mar','div','c','mar','mar','div','mar','mar','c','div','mar','mar','c','mar')
myd<-data.frame(id,time,status)
id time status
1 2 3 mar
2 2 5 mar
3 2 7 div
4 2 8 c
5 2 9 mar
6 3 2 mar
7 3 8 div
8 3 10 mar
9 3 12 mar
10 3 14 c
11 3 18 div
12 4 4 mar
13 4 6 mar
14 4 7 c
15 4 9 mar
我需要知道这个人什么时候结婚(如果有两个连续的 'mar' 行,中间没有 'div',那么这个人从未离婚,因此它是同一个婚姻,我们不需要那个时间重复信息;mar, c, mar的序列也是如此,由于没有检测到div,因此child前后的婚姻是同一个婚姻,因此可以删除第二个)。我怀疑我需要得到 min(time[status=='mar']) 但如果那个人得到一个 mar,mar,div,mar,div,mar 序列,这将是不正确的(只有 2nd mar 需要删除,而不是所有第一个之后的)。
所以新数据应该看起来像
id time status
2 2 5 mar
3 2 7 div
4 2 8 c
5 2 9 mar
6 3 2 mar
7 3 8 div
8 3 10 mar
10 3 14 c
11 3 18 div
13 4 6 mar
14 4 7 c
这是我的方法,只适用于一行
myd2<-myd %>%
group_by(id) %>%
mutate(dum1=ifelse(status=='mar',min(time[status=='mar']),NA),
dum2=cumsum(status=='div'),
flag=ifelse(time>dum1 & dum2==0,1,0))
如果我去掉了 dum2==0 那么它删除了太多行。
【问题讨论】:
标签: r data.table tidyverse