在数据框中重复应用ave计算组意味着

时间:2013-01-03 19:02:22

标签: r

以下代码根据x分别生成ygroup的组均值。假设我有许多重复相同操作的变量。

您如何建议继续以通过单个命令获得相同的结果? (我想有必要采用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

非常感谢。

3 个答案:

答案 0 :(得分:4)

使用data.tableplyr包的替代解决方案:

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

答案 1 :(得分:3)

假设您只有两列,您可以使用applyave应用于矩阵中的每一列。

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

答案 2 :(得分: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()调用。