【问题标题】:Transform a Matrix to a Matrix of Cumulative Row Averages in R将矩阵转换为 R 中的累积行平均值矩阵
【发布时间】:2014-03-11 01:10:44
【问题描述】:

我有一个预测矩阵。每一行是对个人的预测,每一列是来自特定模型的预测。我想对此进行转换,因此第一列是第一个模型的预测,第二列是第一个 第二个模型的预测的 平均值 等.

因此,转换后的矩阵将包含原始矩阵中观察值的运行累积平均值。

我感觉 cumsum 可以与 apply 函数一起使用来实现这一点,但我不确定如何获得优雅的结果(用于大型矩阵)。

谢谢!

【问题讨论】:

    标签: r matrix average linear-algebra


    【解决方案1】:

    试试这个:

    # Initialize a testing matrix
    (m <- matrix(1:12, 3, 4))
    
         [,1] [,2] [,3] [,4]
    [1,]    1    4    7   10
    [2,]    2    5    8   11
    [3,]    3    6    9   12
    
    # Calculate cumulative average by column for each row
    t(apply(m, 1, cumsum) / seq(ncol(m)))
    
         [,1] [,2] [,3] [,4]
    [1,]    1  2.5    4  5.5
    [2,]    2  3.5    5  6.5
    [3,]    3  4.5    6  7.5
    

    这实质上是逐行累积求和,然后除以指示列索引的循环数组。

    编辑:如果您对数据框做类似的事情,这种使用 data.table 和 reshape2 包的方法可能会很有用:

    library(data.table)
    dt <- data.table(m)
    # Add row number to melt by
    dt[, row := seq(nrow(dt))]
    
    library(reshape2)
    dt.molten <- data.table(melt(dt, "row"))
    # Row-level format
    dt.molten[, cumsum(value) / as.numeric(variable), "row"]
    
        row  V1                                                                                          
     1:   1 1.0                                                                                          
     2:   1 2.5                                                                                          
     3:   1 4.0                                                                                          
     4:   1 5.5                                                                                          
     5:   2 2.0                                                                                          
     6:   2 3.5                                                                                          
     7:   2 5.0                                                                                          
     8:   2 6.5                                                                                          
     9:   3 3.0                                                                                          
    10:   3 4.5                                                                                          
    11:   3 6.0
    12:   3 7.5
    

    【讨论】:

      【解决方案2】:

      使用建议的cumsumapply

      mat <- matrix(1:24,ncol=6)
      mat
      #     [,1] [,2] [,3] [,4] [,5] [,6]
      #[1,]    1    5    9   13   17   21
      #[2,]    2    6   10   14   18   22
      #[3,]    3    7   11   15   19   23
      #[4,]    4    8   12   16   20   24
      
      t(apply(mat,1,cumsum)/(seq_len(ncol(mat))))
      #     [,1] [,2] [,3] [,4] [,5] [,6]
      #[1,]    1    3    5    7    9   11
      #[2,]    2    4    6    8   10   12
      #[3,]    3    5    7    9   11   13
      #[4,]    4    6    8   10   12   14
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2018-12-02
        • 1970-01-01
        • 1970-01-01
        • 2023-04-05
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多