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
如您所见,它给出了 a
的 unique
值,并且对每个值都计算了所需的函数(在本例中为 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
我正在尝试从两个等长向量中使两个子向量等长。
第一个向量中的值按如下顺序排列:
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
如您所见,它给出了 a
的 unique
值,并且对每个值都计算了所需的函数(在本例中为 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