有2个示例数据库,如下所示
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,并且所有contr$date在% d$date中都是%,我想要的是y,它是一个向量,对于每个在%d$date中有一个contr$date%的d$id包含一个contr$w。
我尝试过这种方法,但我相信肯定有一种更简单的方法,即simpler=better方法。
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))
}
}有人能帮忙吗?非常感谢,马可
发布于 2014-06-30 21:14:30
实际上,我现在已经编写了一个循环来完成这个任务(之前的答案没有工作,因为在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],]
}
}我确信这不是最好的代码,但它有效。第二次查看说明了没有匹配日期的情况下的少数情况,因此我选择了最接近日期的sampled()一个。如果你能想出一个更快的版本,那就太好了。我的数据集是关于d=~5K行和contr=~2.5百万行的,运行大约需要2个小时。痛苦但值得等待!
发布于 2014-06-23 10:12:11
这做了我想做的,也许我的解释不够清楚。我只想给每个id一个随机的日期(然后我可以创建w列)。我使用了另一个问题的解决方案来解决这个问题:
不管怎么说,还是有很多汉克斯在努力!马可
https://stackoverflow.com/questions/24327229
复制相似问题