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

R 从一行中选择前n个元素并取其平均值,r,R,我有一个代表资产回报的数据。我想从每一行中选择前N名资产,并计算所选资产的平均回报率。具体地说,我想创建一个函数,从一行中选择不同的元素,并对这些元素进行平均。就像第一行一样,我想根据排名选择前3位的元素,并计算这些元素的平均值。从第二个开始,我想选择前五名和它的平均值等等。我的意思是元素的数量会因行而异。我试着做个例子。在下面的示例中,测试数据表示从中提取资产的数据,top n表示从每一行中提取的资产数量,秩表示根据将选择的资产对资产的排序。就像第一行一样,我想根据排名选择前三名的资产。第二步

我有一个代表资产回报的数据。我想从每一行中选择前N名资产,并计算所选资产的平均回报率。具体地说,我想创建一个函数,从一行中选择不同的元素,并对这些元素进行平均。就像第一行一样,我想根据排名选择前3位的元素,并计算这些元素的平均值。从第二个开始,我想选择前五名和它的平均值等等。我的意思是元素的数量会因行而异。我试着做个例子。在下面的示例中,测试数据表示从中提取资产的数据,top n表示从每一行中提取的资产数量,秩表示根据将选择的资产对资产的排序。就像第一行一样,我想根据排名选择前三名的资产。第二步,我想根据排名选择前5位的元素。最后,我将得到每行前n位资产的平均回报率

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)

test\u data我们可以使用
sapply
在每一行上循环,使用
tail
选择相应的
top\n
元素,并取
平均值

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
数据

set.seed(123)
test_data<- matrix(rnorm(100),nrow=10)
top_n<-c(3,5,9,4,8,7,6,8,3,2)
set.seed(123)

测试数据我们可以使用
mapply
asplit
来自
base R

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
数据
set.seed(123)

如果要选择底部n,请测试\u dataSir。我必须在代码中做哪些更改。@simar而不是
tail
使用
head
sapply(seq_-along(top_n),function(x)mean(head(sort(test_-data[1],top_-n[x])
set.seed(123)
test_data<- matrix(rnorm(100),nrow=10)
top_n<-c(3,5,9,4,8,7,6,8,3,2)