8

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

> 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

measureその特定の主題の平均を含む新しい変数を生成したいので、次のようにします。

subject  time  measure  mn_measure
1          0      10      10
1          1      12      10
1          2       8      10
2          0       7      2.333
2          1       0      2.333
2          2       0      2.333

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

4

3 に答える 3

14

紛らわしい名前にもかかわらず、 :ave()を含むさまざまな統計を計算できるベースR関数を使用します。mean

within(mydata, mean<-ave(measure, subject, FUN=mean))

  subject time measure      mean
1       1    0      10 10.000000
2       1    1      12 10.000000
3       1    2       8 10.000000
4       2    0       7  2.333333
5       2    1       0  2.333333
6       2    2       0  2.333333

withinコードを短くするためだけに使用していることに注意してください。これは、次のない同等のものwithin()です。

mydata$mean <- ave(mydata$measure, mydata$subject, FUN=mean)
mydata
  subject time measure      mean
1       1    0      10 10.000000
2       1    1      12 10.000000
3       1    2       8 10.000000
4       2    0       7  2.333333
5       2    1       0  2.333333
6       2    2       0  2.333333
于 2013-02-11T12:52:21.310 に答える
9

またはdata.tableパッケージで:

require(data.table)
dt <- data.table(mydata, key = "subject")
dt[, mn_measure := mean(measure), by = subject]

#   subject time measure mn_measure
# 1:       1    0      10  10.000000
# 2:       1    1      12  10.000000
# 3:       1    2       8  10.000000
# 4:       2    0       7   2.333333
# 5:       2    1       0   2.333333
# 6:       2    2       0   2.333333
于 2013-02-11T12:52:41.880 に答える
6

パッケージddplyから使用できます:plyr

library(plyr)
res = ddply(mydata, .(subject), mutate, mn_measure = mean(measure))
res
  subject time measure mn_measure
1       1    0      10  10.000000
2       1    1      12  10.000000
3       1    2       8  10.000000
4       2    0       7   2.333333
5       2    1       0   2.333333
6       2    2       0   2.333333
于 2013-02-11T12:50:13.043 に答える