如果id在R中的数据集之间匹配,则查找日期是否在14天内



我有两个数据集,如下:

id<-c(5,8,11,11,13,14)
date<-c("2001-1-1","2002-2-2","2003-3-3","2003-6-3","2004-4-4","2005-5-5")
data<-data.frame(cbind(id,date))
id<-c(1,2,3,4,5,5,6,7,7,8,9,10,10,11,11,12,13)
date<-c("2001-1-2","2002-1-1","2002-3-3","2002-4-15","1999-10-12","2002-12-25","2008-4-9","2005-2-6","2004-5-14","2004-10-30","2011-4-25","2013-12-10","2014-1-1","2001-1-1","2003-2-26","2003-3-2","2010-10-10","2004-4-4")
ns<-data.frame(cbind(id,date))

请注意,只有data中的部分id包含在ns中,反之亦然。

我试图找到数据$id中的每个值,如果有一个na$日期,在data$date之前14天,其中data$id==ns$id

这是我写的,但是有没有更快的方法(现在需要很长时间,因为我在每个数据集中有数千个条目),而且我认为它也不起作用。

 data$episode<-c(1:length(data$id))
 ns$episode<-c(1:length(ns$id))
 data$date<-as.Date(data$date, format="%Y-%m-%d")
 ns$date<-as.Date(ns$date,format="%Y-%m-%d")
 z<-0
 for(i in data$episode){
   for(j in ns$episode){
     z=z+1
     received[z]<-ifelse(data$id[i]==ns$id[j],
                      ifelse(as.numeric(data$date[i]-ns$date[j])<14,1,0),
                      NA)
   }
 }
 received<-received[!is.na(received)]

我需要的输出是具有相同长度的data$episode的向量,如果ns$date[ns$id==data$id]中的日期比各自的data$date早14天,则为1。

注意:我使用lubridate来转换日期。

library(lubridate)
# convert dates
data$date <- ymd(data$date)
ns$date <- ymd(ns$date)
# left join datasets
tmp <- merge(data, ns, by="id", all.x=TRUE)
# create variable for less than 14 days
tmp$received <- with(tmp, abs(difftime(date.x, date.y, units="days")) < 14)
# check each id and date combination for TRUE
tmp <- aggregate(received ~ id + date.x, tmp, any)
names(tmp) <- c("id", "date", "received")
# merge back into data to capture missing groups
tmp <- merge(data, tmp, by=c("id", "date"), all.x=TRUE)

我做了一个左连接,因为你想让新向量的长度与data相同。也就是说,有一个NA值(使用示例数据),因为data中有一个id,而ns中没有。

使用示例数据:

> tmp
  id       date received
1 11 2003-03-03     TRUE
2 11 2003-06-03    FALSE
3 13 2004-04-04     TRUE
4 14 2005-05-05       NA
5  5 2001-01-01     TRUE
6  8 2002-02-02    FALSE

最新更新