3

次のコードは、のグループ平均を個別に生成xyますgroup。同じ操作を繰り返す変数がいくつかあるとします。

1つのコマンドで同じ結果を得るには、どのように進めますか?(採用する必要があると思いますがtapply、よくわかりません。)

x=seq(1,11,by=2); y=seq(2,12,by=2); group=rep(1:2, each=3)
dat <- data.frame(cbind(group, x, y))

dat$m_x <- ave(dat$x, dat$group)
dat$m_y <- ave(dat$y, dat$group)
dat

どうもありがとう。

4

3 に答える 3

4

data.tableおよびplyrパッケージを使用した代替ソリューション:

1) 使用data.table

require(data.table)
dt <- data.table(dat, key="group")
# Following @Matthew's comment, edited:
dt[, `:=`(m_x = mean(x), m_y = mean(y)), by=group]

出力:

   group  x  y m_x m_y
1:     1  1  2   3   4
2:     1  3  4   3   4
3:     1  5  6   3   4
4:     2  7  8   9  10
5:     2  9 10   9  10
6:     2 11 12   9  10

2) 使用plyrして変換:

require(plyr)
ddply(dat, .(group), transform, m_x=mean(x), m_y=mean(y))

出力:

  group  x  y m_x m_y
1     1  1  2   3   4
2     1  3  4   3   4
3     1  5  6   3   4
4     2  7  8   9  10
5     2  9 10   9  10
6     2 11 12   9  10

3)plyrと numcolwise を使用 (縮小された出力に注意してください):

ddply(dat, .(group), numcolwise(mean))

出力:

  group x  y
1     1 3  4
2     2 9 10
于 2013-01-03T19:30:57.443 に答える
3

2 つ以上の列があると仮定すると、マトリックス内のすべての列にapply適用するために使用したいと思うでしょう。ave

x=seq(1,11,by=2); y=seq(2,12,by=2); group=rep(1:2, each=3)
dat <- cbind(x, y)

ave.dat <- apply(dat, 2, function(column) ave(column, group))
#       x  y
# [1,]  1  2
# [2,]  3  4
# [3,]  5  6
# [4,]  7  8
# [5,]  9 10
# [6,] 11 12
于 2013-01-03T19:12:51.947 に答える
1

また、aggregate() を使用することもできます。

dat2 <- data.frame(dat, aggregate(dat[,-1], by=list(dat$group), mean)[group, -1])
dat2
    group  x  y x.1 y.1
1       1  1  2   3   4
1.1     1  3  4   3   4
1.2     1  5  6   3   4
2       2  7  8   9  10
2.1     2  9 10   9  10
2.2     2 11 12   9  10
row.names(dat2) <- rownames(dat)
colnames(dat2) <- gsub("(.)\\.1", "m_\\1", colnames(dat2))
dat2
  group  x  y m_x m_y
1     1  1  2   3   4
2     1  3  4   3   4
3     1  5  6   3   4
4     2  7  8   9  10
5     2  9 10   9  10
6     2 11 12   9  10    

変数名が複数の文字である場合は、gsub() 呼び出しを変更する必要があります。

于 2013-01-05T22:09:29.903 に答える