首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >R:基于另一个向量中重复序列的子向量的均值

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

Stack Overflow用户
提问于 2016-02-17 11:42:14
回答 3查看 175关注 0票数 0

我试图使两个子向量等长,从两个向量等长。

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

代码语言:javascript
运行
复制
 a<-c(9,9,9,8,8,7,6,5,5,5)

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

代码语言:javascript
运行
复制
 b<-c(1,2,3,4,5,6,7,8,9,10) 

第一个子向量很简单:它只是具有重复序列的向量a

代码语言:javascript
运行
复制
 f(a)<-c(9,8,7,6,5)

第二个子向量应该是:对于向量a中的单个值(a中没有重复序列),向量g(b)在相应位置上具有与向量b相同的值。对于a中的重复序列,g(b)值应该是对应的子向量b值的平均值。所以:

代码语言:javascript
运行
复制
g(b)<-c(mean(c(1,2,3)), mean(c(4,5)), 6, 7, mean(c(8,9,10)))

我不知道从哪里开始。寻求帮助!

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2016-02-17 11:55:36

tapply是您想要的函数。请参阅?tapply以了解它的工作原理。在此:

代码语言:javascript
运行
复制
res<-tapply(b,a,mean) 
#  5   6   7   8   9 
#9.0 7.0 6.0 4.5 2.0

如果您想保留顺序:

代码语言:javascript
运行
复制
tapply(b,a,mean)[as.character(unique(a))]
#  9   8   7   6   5 
#2.0 4.5 6.0 7.0 9.0

正如您所看到的,它给出了uniquea值,并对每个值计算所需的函数(在本例中为mean(b))。

票数 1
EN

Stack Overflow用户

发布于 2016-02-17 12:00:22

你可以这样做:

代码语言:javascript
运行
复制
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
票数 1
EN

Stack Overflow用户

发布于 2016-02-17 12:55:40

我们也可以使用ave

代码语言:javascript
运行
复制
unique(ave(b, a))
#[1] 2.0 4.5 6.0 7.0 9.0

或者另一个选项是使用指定的factor将'b‘转换为levels

代码语言:javascript
运行
复制
tapply(b, factor(a, levels=unique(a)), FUN=mean)
#  9   8   7   6   5 
#2.0 4.5 6.0 7.0 9.0 
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/35455727

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档