【问题标题】:Reshape matrix and transform it to data frame keeping track of original row and column index重塑矩阵并将其转换为跟踪原始行和列索引的数据框
【发布时间】:2019-09-06 10:39:45
【问题描述】:

我有一个大的 n x m 矩阵,我想将它转换为 (n * m) x 3 数据框(我的矩阵类似于 1400 x 800)。数据框的第一列应包含矩阵行索引。第二列应包含矩阵列索引,数据框的第三列应包含矩阵中每个单元格的值。

我用 for 循环解决了这个问题,但我认为这不是最好的方法。我想知道是否有更简单或更有效的方法来实现相同的最终数据帧。

这是我想改进的解决方案的一个可重现的小代码。

mtx <- array(rep(rnorm(12)), dim = c(4,3))

df <- expand.grid(rnum = 1:4, cnum = 1:3)
df$cell <- NA

for (i in 1:nrow(df)){
  df$cell[i] <- mtx[df$rnum[i],df$cnum[i]]
}

【问题讨论】:

    标签: r


    【解决方案1】:

    我们可以使用row/col获取矩阵中每个值的行值和列值,然后将矩阵折叠成向量得到实际值和cbind一起得到。

    cbind.data.frame(rnum = c(row(mtx)), cnum = c(col(mtx)), cell = c(mtx))
    
    #   rnum cnum       cell
    #1     1    1 -1.2070657
    #2     2    1  0.2774292
    #3     3    1  1.0844412
    #4     4    1 -2.3456977
    #5     1    2  0.4291247
    #6     2    2  0.5060559
    #7     3    2 -0.5747400
    #8     4    2 -0.5466319
    #9     1    3 -0.5644520
    #10    2    3 -0.8900378
    #11    3    3 -0.4771927
    #12    4    3 -0.9983864
    

    我们可以使用which 的一个技巧是找到一个始终为TRUE 的条件,使用arr.ind = TRUE 获取行和列索引,并使用cbind 获取与上述相同的值。

    cbind.data.frame(which(mtx > 0 | mtx < 0, arr.ind = TRUE), cell = c(mtx))
    

    数据

    set.seed(1234)
    mtx <- array(rep(rnorm(12)), dim = c(4,3))
    

    【讨论】:

      【解决方案2】:

      我们可以通过melt 做到这一点

      library(reshape2)
      melt(mtx)
      #   Var1 Var2      value
      #1     1    1 -1.2070657
      #2     2    1  0.2774292
      #3     3    1  1.0844412
      #4     4    1 -2.3456977
      #5     1    2  0.4291247
      #6     2    2  0.5060559
      #7     3    2 -0.5747400
      #8     4    2 -0.5466319
      #9     1    3 -0.5644520
      #10    2    3 -0.8900378
      #11    3    3 -0.4771927
      #12    4    3 -0.9983864
      

      数据

      set.seed(1234)
      mtx <- array(rep(rnorm(12)), dim = c(4,3))
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2014-09-22
        • 1970-01-01
        • 2016-02-14
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-11-03
        相关资源
        最近更新 更多