以下代码根据x
分别生成y
和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
非常感谢。
答案 0 :(得分: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
答案 1 :(得分: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
答案 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()调用。