3

以下代码分别产生 和 的xy均值group。假设我有许多变量重复相同的操作。

为了通过单个命令获得相同的结果,您建议如何进行?(我认为有必要采用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

假设您有不止两列,您可能希望用于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

您还可以使用聚合():

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 回答