我正在尝试编写一个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))
}
似乎我正在创建新变量,但我知道滞后将无法正常工作,因为我缺少步骤。也许我也误解了其他人如何使用滞后函数的例子?
答案 0 :(得分:1)
这样可以完全回答。你的代码有一些问题。卢卡诺已经指出了一个。每次通过循环,您将创建temp
,temp2
和temp3
(或覆盖旧的)。因此,你将只留下最后一次循环的输出。
然而,这不是一个需要循环的东西。相反,您可以使用R
x <- 1:10
> c(x[-1], NA)
[1] 2 3 4 5 6 7 8 9 10 NA
因此,如果您将这个概念与像plyr
这样的库结合起来,可以很好地分割数据,那么您应该有一个可行的解决方案。如果我遗漏了某些内容或者这不能解决您的问题,请提供reproducible example。
library(plyr)
myLag <- function(x) {
c(x[-1], NA)
}
ddply(part2test, .(uniquerid), transform, EXAMDATE_LAG=myLag(EXAMDATE))
您也可以使用split
或data.table
包使用by=
参数在基础R中执行此操作。