我试图使两个子向量等长,从两个向量等长。
第一个向量中的值排序如下:
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)))
我不知道从哪里开始。寻求帮助!
发布于 2016-02-17 11:55:36
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)
)。
发布于 2016-02-17 12:00:22
你可以这样做:
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
发布于 2016-02-17 12:55:40
我们也可以使用ave
unique(ave(b, a))
#[1] 2.0 4.5 6.0 7.0 9.0
或者另一个选项是使用指定的factor
将'b‘转换为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
https://stackoverflow.com/questions/35455727
复制相似问题