我有两个data.frames(分别称为dataset.new和dataset.old),它们都包含有关某些个人的信息。这些人都在两个data.frames中都有一个标识号(我们可以将其称为“个体”变量),并且每个帧都有有关数据收集时间的信息,存储在我们称为“ some.date”的列中。 ”。
这两个data.frames(dataset.old)中的第二个包含有关个体的历史数据,即在其他时间测量的某些其他变量的值,因此每个个体在dataset.old中出现多次。
我想做的是以下几点。对于dataset.new中的每个人,从dataset.old中找到最新的行,但仍比dataset.new中的观测值旧。对于dataset.old中没有此类日期的个人,我希望它返回NA。
这可能是通过下面提供的一些示例数据最容易说明的。
dataset.new
individual some.date
1 1 2016-05-01
2 2 2016-01-28
3 7 2016-03-03
dataset.old
individual some.date
1 1 2016-01-12
2 1 2015-12-30
3 1 2016-04-27
4 1 2016-05-02
5 2 2015-11-15
6 2 2012-01-27
7 2 2016-02-06
8 3 2016-04-30
9 3 2016-01-27
10 4 2016-03-01
11 4 2011-01-16
在此示例中,我正在寻找一种获取以下输出的方法:
individual row.nr
1 1 3
2 2 5
3 7 NA
因为这些行对应于dataset.old中的最新数据,但仍早于dataset.new中的数据。
我有一个可以解决问题的代码,但是对于我要记住的数据来说太慢了(dataset.new中有超过2万行,dataset.old中有很多行)。我的解决方案基本上是遍及所有个人的循环,在每个阶段对数据进行细分。
find.previous <- function(dataset.old, individual, some.new.date){
subsetted.dataset <- dataset.old[dataset.old[, "individual"] == individual, ] # We only look at the individual in question.
subsetted.dataset <- subsetted.dataset[subsetted.dataset[, "some.date"] < some.new.date, ]# Here we get all the rows that have data that are measured BEFORE timepoint.
row.index <- which.min(some.new.date - subsetted.dataset[, "some.date"]) # This can be done, since we have already made sure that fromdatum < timepoint.
ifelse(length(row.index)!= 0, as.integer(rownames(subsetted.dataset[row.index,])), NA) # Then we output the row that had that information.
}
output <- matrix(ncol=2, nrow=0)
for(i in 1:nrow(dataset.new)){
output <- rbind(output, cbind(dataset.new[, "individual"][i], find.previous(dataset.old, dataset.new[, "individual"][i], dataset.new[, "some.date"][i])))
}
colnames(output) <- c("individual", "row.nr")
output
任何有关如何解决此问题的帮助将不胜感激。我尝试使用我的Google技能以及在此处stackoverflow上阅读其他文章,但没有成功。
可以通过复制以下代码行来复制示例数据:
dataset.new <- data.frame(individual=c(1, 2, 7), some.date=as.Date(c("2016-05-01", "2016-01-28", "2016-03-03")))
dataset.old <- data.frame(individual=c(1,1,1,1,2,2,2,3,3,4,4), some.date=as.Date(c("2016-01-12", "2015-12-30", "2016-04-27", "2016-05-02", "2015-11-15", "2012-01-27", "2016-02-06", "2016-04-30", "2016-01-27", "2016-03-01", "2011-01-16")))
您可以通过合并有效地解决此问题。
首先在数据集.old中创建所需的行号变量。然后dataset.new
与合并dataset.old
(左联接或merge(lhs, rhs, all.x = TRUE)
)。这可以使您:
dataset.old
individual new.date old.date old.rownumber
1 1 2016-05-01 2016-01-12 1
2 1 2016-05-01 2015-12-30 2
3 1 2016-05-01 2016-04-27 3
4 1 2016-05-01 2016-05-02 4
5 2 2016-01-28 2015-11-15 5
6 2 2016-01-28 2012-01-27 6
7 2 2016-01-28 2016-02-06 7
8 7 2016-03-03 NA NA
子集为new.date > old.date
或is.na(old.date)
:
dataset.old
individual new.date old.date old.rownumber
1 1 2016-05-01 2016-01-12 1
2 1 2016-05-01 2015-12-30 2
3 1 2016-05-01 2016-04-27 3
5 2 2016-01-28 2015-11-15 5
6 2 2016-01-28 2012-01-27 6
8 7 2016-03-03 NA NA
的子集old.date == max(old.date)
或is.na(old.date)
由分组individual
。
dataset.old
individual new.date old.date old.rownumber
3 1 2016-05-01 2016-04-27 3
6 2 2016-01-28 2012-01-27 5
8 7 2016-03-03 NA NA
编辑:我偏爱data.table
。代码如下所示:
dataset.old[, old.rownumber := 1:.N]
setnames(dataset.old, "some.date", "old.date")
setnames(dataset.new, "some.date", "new.date")
dataset.merge <- merge(dataset.old, dataset.new, by = "individual", all.x = TRUE)
dataset.merge <- dataset.merge[, new.date > old.date]
dataset.merge[old.date == max(old.date) | is.na(old.date), by = individual]
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句