有两个示例数据库如下
id<-c(1,2,3,1,4,3,5)
date<-c("2011-1-1","2011-1-1","2011-2-2","2012-3-3","2012-4-4","2012-5-5","2012-6-6")
d<-data.frame(cbind(id,date))
colnames(d)<-c("id","date")
d$w<-do.call(paste,c(d[c("id","date")],sep=" "))
id<-c(7,8,9,10,7,10,8,10,11,12)
date<-c("2011-1-1","2011-1-1","2011-2-2","2012-3-3","2012-3-3","2012-4-4","2012-4-4","2012-5-5","2012-6-6","2012-6-6")
contr<-data.frame(cbind(id,date))
colnames(contr)<-c("id","date")
contr$w<-do.call(paste,c(contr[c("id","date")],sep=" "))
考虑在两个数据集中重复id和日期,但d $ id与contr $ id不同,并且所有控制日期都是%d%date 我想要的是y这是一个向量,包括一个控制对于每个d $ id,在%d $ date中有一个控制日期%
我尝试了这个不起作用,但我确信必须有一个更简单,更简单=更好的方法来做到这一点。
y<-0
for(i in length(levels(factor(d$w)))){
for(j in length(levels(factor(contr$w)))){
z<-ifelse(d$date[i]==contr$date[j],contr$w[j],NA)
y<-c(y,z)
y<-subset(y,!is.na(y))
}
}
任何人都可以提供帮助? 非常感谢, 马可
答案 0 :(得分:0)
这就是我想要的,也许我在解释中不够清楚。我只想要每个id的随机日期(然后我可以创建w列)。我已经使用另一个问题的解决方案对此进行了排序:
很多 无论如何都要努力! 马可
答案 1 :(得分:0)
实际上我现在写了一个循环来执行此操作(之前的答案不起作用,因为d中的某些情况没有匹配日期)。它非常慢,但它完全符合我的要求
for(i in 1:length(d$rownames)){
if(TRUE%in%levels(factor(contr$w%in%d$w[i]))==TRUE){
control.2$rownames[i]<-sample(contr$rownames[ctr$w==d$w[i]],1)
contr<-contr[!contr$rownames%in%control.2$rownames[i],]
}else{
z<-contr[contr$practice==d$practice[i],]
z$tempo<-abs(difftime(z$date,d$date[i],units="days"))
z<-z[!is.na(z$tempo),]
z<-z[z$tempo==min(z$tempo),]
control.2$rownames[i]<-sample(z$rownames,1)
contr<-contr[!contr$rownames%in%control.2$rownames[i],]
}
}
我确定不是最好的代码,但它确实有用。第二个外观考虑了几个没有匹配日期的情况,所以我选择了最接近日期的采样()。如果你能想出一个更快的版本,那就太好了。我的数据集大约是d = ~5K行和contr = ~250万行,运行大约需要2个小时。痛苦但值得等待!