我有两个数据集,如下:
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