我有一个数据集,如下所示:
df=data.frame(c(1,2,2,2,3,4,4),
as.Date(c("2015-01-29","2015-02-02","2015-02-02","2015-02-02","2014-05-04","2014-05-04","2014-05-04")),
as.Date(c( "2010-10-01","2009-09-01","2014-01-01","2014-02-01","2009-01-01","2014-03-01","2013-03-01")),
as.Date(c("2016-04-30","2013-12-31","2014-01-31","2016-04-30","2014-02-28","2014-08-31","2013-05-01")));
names(df)=c('id','poi','start','end')
> df
id poi start end
1 1 2015-01-29 2010-10-01 2016-04-30
2 2 2015-02-02 2009-09-01 2013-12-31
3 2 2015-02-02 2014-01-01 2014-01-31
4 2 2015-02-02 2014-02-01 2016-04-30
5 3 2014-05-04 2009-01-01 2014-02-28
6 4 2014-05-04 2014-03-01 2014-08-31
7 4 2014-05-04 2013-03-01 2013-05-01
开始日期和结束日期是保险的开始和结束日期,有时多行的开始日期相同,因为它们属于不同的保险类型。我对保留那些在POI前后一年具有一致保险范围的ID感兴趣。每个ID只能有1个POI。
我的输出将是一个有保险覆盖范围的身份证1年前和1年后的兴趣点列表。在这种情况下,它将排除身份证3和4,因为他们没有保险覆盖范围1年后的兴趣点。
ids=c(1,2)
我已经尝试了以下方法,但老实说,我不知道如何才能达到我想要的。
任何帮助都将不胜感激。
library(rehape2)
df.melt=melt(df,
id=c("id","poi"))
df.melt=mutate(df.melt, flag=ave(id,id,variable,FUN=seq_along))
df.melt=mutate(df.melt, variable=paste(variable,flag,sep ="_"))
df.cast=dcast(df.melt, id+poi~variable)
2条答案
按热度按时间kuuvgm7e1#
如果要使用
dplyr
和lubridate
分别计算行:如果您更愿意计算一个ID的所有行,则可能类似于
如果可能的话,这种方法会忽略覆盖率中的间隙,如果是这样的话,
lubridate::interval
和int_overlaps
在仔细压缩行时可能是有用的。nnsrf1az2#
我认为这符合您的要求,但如果不符合,您应该可以使用大于号和小于号:
这将为您提供保存所需值的两行df。
现在只剩下id了: