2

我正在尝试编写一个 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))
}

似乎我创建新变量很好,但我知道延迟将无法正常工作,因为我缺少步骤。也许我也误解了其他人关于如何使用滞后功能的例子?

4

1 回答 1

1

这样才能完全回答。您的代码有一些问题。卢卡诺指出了一个问题。每次通过您的循环,您都将创建temptemp2temp3(或覆盖旧的)。因此,您将只剩下最后一次循环的输出。

但是,这不是需要循环的东西。相反,您可以利用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))

您也可以在 base R usingsplitdata.table使用其by=参数的包中执行此操作。

于 2012-09-14T20:16:21.993 回答