我试图从两个相等长度的矢量中制作两个相等长度的子向量。
第一个向量中的值按如下顺序排列:
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)))
我不知道从哪里开始。求救!
答案 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