首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >从一行中选择前n个元素并取其平均值

从一行中选择前n个元素并取其平均值
EN

Stack Overflow用户
提问于 2019-12-14 03:32:44
回答 2查看 75关注 0票数 2

我有一个代表资产回报的数据。我希望从每一行中选择top N资产,并计算所选资产的返回均值。详细地说,我想要创建一个函数,该函数将从行中选择不同的元素,并对该元素进行处理。和第一行一样,我想根据排名选择前3位元素,并计算这些元素的平均值。从第二位开始,我想选择前5位和它的平均值等等。我的意思是,元素的数量将因行而异。我试着做一个例子。在下面的示例中,test_data表示要从哪些资产中提取的数据,top_n表示要从每一行提取的资产数量,等级表示将根据将选择哪些资产的资产进行排序。就像从第一排开始,我想根据排名来选择前三名资产。在第二,我想要选择前5个元素,根据rank.In,我将得到每一行顶级n个资产的平均回报。

代码语言:javascript
复制
test_data<-matrix(rnorm(100),nrow=10)
rank<-apply(-test,1,rank)
top_n<-c(3,5,9,4,8,7,6,8,3,2,4)
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2019-12-14 03:40:23

我们可以使用sapply循环每一行,使用tail选择它各自的top_n元素,并获取它的mean

代码语言:javascript
复制
sapply(seq_along(top_n), function(x) mean(tail(sort(test_data[x, ]), top_n[x])))
#[1] 0.881 0.211 0.258 1.265 0.237 1.053 0.939 0.126 0.801 1.652

数据

代码语言:javascript
复制
set.seed(123)
test_data<- matrix(rnorm(100),nrow=10)
top_n<-c(3,5,9,4,8,7,6,8,3,2)
票数 3
EN

Stack Overflow用户

发布于 2019-12-14 15:52:07

我们可以将mapply与来自base Rasplit一起使用

代码语言:javascript
复制
mapply(function(dat, n) mean(tail(sort(dat), n)), asplit(test_data, 1), top_n)
#[1] 0.8813500 0.2114054 0.2584815 1.2650171 0.2365432 1.0525673
#[7] 0.9391072 0.1261873 0.8011962 1.6519498

数据

代码语言:javascript
复制
set.seed(123)
test_data<- matrix(rnorm(100),nrow=10)
top_n<-c(3,5,9,4,8,7,6,8,3,2)
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/59332102

复制
相关文章

相似问题

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