我正试图编写一个for循环,该循环将按人员id获取数据帧的子集,然后将EXAMDATE变量滞后一个进行比较。因此,给定的行将具有原始EXAMDATE和变量EXAMDATE_LAG,该变量将在其前面一行包含EXAMDATE的值。
for (i in length(uniquerid))
{
temp <- subset(part2test, RID==uniquerid[i])
temp$EXAMDATE_LAG <- temp$EXAMDATE
temp2 <- data.frame(lag(temp, -1, na.pad=TRUE))
temp3 <- data.frame(cbind(temp,temp2))
}
看起来我创建新变量很好,但我知道滞后不会正常工作,因为我错过了步骤。也许我也误解了其他人关于如何使用滞后函数的例子?
这样就可以完全回答这个问题。您的代码有一些错误。卢卡诺指出了一点。每次循环时,您都要创建temp
、temp2
和temp3
(或覆盖旧的)。因此,您将只剩下最后一次循环的输出。
然而,这并不需要循环。相反,您可以利用R
的矢量化特性
x <- 1:10
> c(x[-1], NA)
[1] 2 3 4 5 6 7 8 9 10 NA
因此,如果您将这个概念与plyr
这样的库相结合,它可以很好地分割数据,那么您应该有一个可行的解决方案。如果我遗漏了什么,或者这不能解决你的问题,请提供一个可重复的例子。
library(plyr)
myLag <- function(x) {
c(x[-1], NA)
}
ddply(part2test, .(uniquerid), transform, EXAMDATE_LAG=myLag(EXAMDATE))
您也可以在基本R中使用split
或在data.table
包中使用其by=
参数来执行此操作。