【问题标题】:selecting the top n elements from a row and taking their mean从一行中选择前 n 个元素并取它们的平均值
【发布时间】:2019-12-14 03:32:44
【问题描述】:

我有一个代表资产回报的数据。我想从每一行中选择前 N 个资产并计算所选资产的平均回报率。详细地说,我想创建一个函数,可以从一行中选择不同的元素,并对这些元素进行平均处理。就像从第一行一样,我想根据排名选择前 3 个元素并计算这些元素的平均值。从第二个开始,我想选择前 5 个和它的平均值,依此类推。我的意思是元素的数量会因行而异。我试着举个例子。在以下示例中,test_data 表示要从中获取资产的数据,top_n 表示要从每行中获取的资产数量,Rank 表示基于将选择哪些资产的资产排名。就像第一行一样,我想根据排名选择前三名资产。其次,我想根据排名选择前 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)

【问题讨论】:

    标签: r


    【解决方案1】:

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

    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)
    

    【讨论】:

    • 先生,如果我想选择底部 n。我必须对代码进行哪些更改。
    • @simar 而不是tail 使用head, sapply(seq_along(top_n), function(x) mean(head(sort(test_data[1, ]), top_n[x])))
    【解决方案2】:

    我们可以使用mapplyasplit 来自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)
    test_data<- matrix(rnorm(100),nrow=10)
    top_n<-c(3,5,9,4,8,7,6,8,3,2)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-05-28
      • 1970-01-01
      • 2012-06-14
      • 2015-02-04
      • 1970-01-01
      • 2014-02-28
      • 1970-01-01
      • 2017-06-11
      相关资源
      最近更新 更多