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

时间:2016-02-17 11:42:14

标签: r vector subset mean

我试图从两个相等长度的矢量中制作两个相等长度的子向量。

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

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

第二个向量是随机的,但我们可以

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

第一个子向量很简单:它只是向量a无重复

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

第二个子向量应按如下方式制作: 对于向量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)))

我不知道从哪里开始。求救!

3 个答案:

答案 0 :(得分:1)

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

正如您所看到的,它提供了unique a的值,并且对于每个值,都会评估所需的函数(在本例中为mean(b))。

答案 1 :(得分:1)

你可以这样做:

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

答案 2 :(得分:1)

我们也可以使用ave

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

或另一种选择是转换&#39; b&#39;指定factor的{​​{1}}

levels