我有2个向量:
a <- c(6,5,3,1,6,7,4,5,3,2)
b <- c(2,1,1,2,3,2,1,3,3,2)
我想要一个简单的代码,它返回一个向量,该向量由向量“a”中所有值的均值组成,位于b中存在相同值的位置。此外,我希望它的排序方式与b的水平相同(水平(as.factor(b)))。
solution = c(mean(5,3,4),mean(6,1,7,2),mean(6,5,3))
更简单的例子:
a <- c(1,2,3,4)
b <- c(1,2,2,1)
solution <- c(2.5,2.5)
非常感谢!
答案 0 :(得分:4)
b <- factor(b, levels=c(2,1,3)) ## Sets the order of the factor's levels.
tapply(a, b, FUN=mean)
# 2 1 3
# 4.000000 4.000000 4.666667
答案 1 :(得分:2)
有几种方法可以实现这一目标。 @Ananda已经提到过一个。一些替代方案是:
aggregate(a,list(b),mean)
ddply(as.data.frame(a),.(b),summarize,mean=mean(a)) # require(plyr)
by(a,b,mean) # this is just a wrapper for tapply
选择取决于您所需的输出格式和实际数据的输入格式(例如矢量与数据帧)。
答案 2 :(得分:1)
data.table
解决方案:
library(data.table)
d = data.table(a = c(6,5,3,1,6,7,4,5,3,2), b = c(2,1,1,2,3,2,1,3,3,2))
d[, mean(a), by = b][order(b)] # (or [order(b), V1] if you just want the means)