使用长格式的数据计算基线的变化

P S*_*laz 2 r

这是我的数据的一个可重现的小示例:

> mydata <- structure(list(subject = c(1, 1, 1, 2, 2, 2), time = c(0, 1, 2, 0, 1, 2), measure = c(10, 12, 8, 7, 0, 0)), .Names = c("subject", "time", "measure"), row.names = c(NA, -6L), class = "data.frame")

> mydata

subject  time  measure
1          0      10
1          1      12
1          2       8
2          0       7
2          1       0
2          2       0
Run Code Online (Sandbox Code Playgroud)

我想生成一个新变量,即“相对于基线的变化”。也就是说,我想

subject  time  measure  change
1          0      10      0
1          1      12      2
1          2       8     -2
2          0       7      0
2          1       0     -7
2          2       0     -7
Run Code Online (Sandbox Code Playgroud)

除了以编程方式遍历所有记录或首先重塑为宽格式之外,是否有一种简单的方法可以做到这一点?

Rol*_*and 5

有很多可能性。我最喜欢的:

library(plyr)
ddply(mydata,.(subject),transform,change=measure-measure[1])

  subject time measure change
1       1    0      10      0
2       1    1      12      2
3       1    2       8     -2
4       2    0       7      0
5       2    1       0     -7
6       2    2       0     -7

library(data.table)
myDT <- as.data.table(mydata)
myDT[,change:=measure-measure[1],by=subject]
print(myDT)

   subject time measure change
1:       1    0      10      0
2:       1    1      12      2
3:       1    2       8     -2
4:       2    0       7      0
5:       2    1       0     -7
6:       2    2       0     -7
Run Code Online (Sandbox Code Playgroud)

如果您的数据集很大,则最好使用data.table。