2

これは私のデータの小さな再現可能な例です:

> 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

「ベースラインからの変化」である新しい変数を生成したいと思います。つまり、私はしたいです

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

プログラムですべてのレコードをループするか、最初にワイドフォーマットに再形成する以外に、これを行う簡単な方法はありますか?

4

3 に答える 3

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

データセットが大きい場合は、data.table を使用することをお勧めします。

于 2013-02-09T12:52:11.207 に答える
3

どうですか:

mydata$change <- do.call("c", with(mydata, lapply(split(measure, subject), function(x) x - x[1])))

aveまたは、次の関数を使用することもできます。

with(mydata, ave(measure, subject, FUN=function(x) x - x[1]))
# [1]  0  2 -2  0 -7 -7

また

within(mydata, change <- ave(measure, subject, FUN=function(x) x - x[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
于 2013-02-09T12:42:51.380 に答える
1

あなたはtapplyを使うことができます:

mydata$change<-as.vector(unlist(tapply(mydata$measure,mydata$subject,FUN=function(x){return (x-rep(x[1],length(x)))})));
于 2013-02-09T13:38:50.697 に答える