R:基于另一个向量中的重复的子向量的平均值

R: Mean of subvectors based on repeats in another vector

我正在尝试从两个等长向量中使两个子向量等长。

第一个向量中的值按如下顺序排列:

 a<-c(9,9,9,8,8,7,6,5,5,5)

第二个向量是随机的,但让我们取

 b<-c(1,2,3,4,5,6,7,8,9,10) 

第一个子向量是 simple:it 只是向量 a 没有重复

 f(a)<-c(9,8,7,6,5)

第二个subvector应该做成如下: 对于向量 a 中的单个值(a 中没有重复),向量 g(b) 与相应位置上的向量 b 具有相同的值。对于 a 中的重复,g(b) 值应该是来自相应子向量 b 的值的平均值。所以:

g(b)<-c(mean(c(1,2,3)), mean(c(4,5)), 6, 7, mean(c(8,9,10)))

我不知道从哪里开始。感谢您的帮助!

tapply就是你要的功能。请参阅 ?tapply 了解其工作原理。这里:

res<-tapply(b,a,mean) 
#  5   6   7   8   9 
#9.0 7.0 6.0 4.5 2.0

如果要保留顺序:

tapply(b,a,mean)[as.character(unique(a))]
#  9   8   7   6   5 
#2.0 4.5 6.0 7.0 9.0

如您所见,它给出了 aunique 值,并且对每个值都计算了所需的函数(在本例中为 mean(b))。

你可以这样做:

uniqueA <- a[!duplicated(a)] # or simply unique(a) but I'm not sure about order preservation
uniqueB <- as.numeric(by(b,match(a,uniqueA),mean))

> uniqueA
[1] 9 8 7 6 5
> uniqueB
[1] 2.0 4.5 6.0 7.0 9.0

我们也可以使用ave

unique(ave(b, a))
#[1] 2.0 4.5 6.0 7.0 9.0

或者另一种选择是将 'b' 转换为 factor 并指定 levels

tapply(b, factor(a, levels=unique(a)), FUN=mean)
#  9   8   7   6   5 
#2.0 4.5 6.0 7.0 9.0