将大型 2d 矩阵快速融化为 3 列 data.table

Bet*_*oo8 4 r data.table

我有一个大矩阵 num [1:62410, 1:48010]

我想要一个长格式的 data.table

例如

   Var1 Var2     value
1:    1    1 -4227.786
2:    2    1 -4211.908
3:    3    1 -4197.034
4:    4    1 -4183.645
5:    5    1 -4171.692
6:    6    1 -4161.634
Run Code Online (Sandbox Code Playgroud)

最小的例子

m = matrix(1:5, nrow = 1000, ncol = 1000)
x = data.table(reshape2::melt(m))
Run Code Online (Sandbox Code Playgroud)

理想情况下,我希望同时列名 x、y 和 value。

以前我一直在使用data.table(melt(mymatrix)). 但是从reshape2::melt已弃用的警告来看,这在速度方面可能不是最佳的,解决这个问题的最佳“data.table”方法是什么?

以下不回答我的问题: 快速融化的数据表操作 正确/最快的方法来重塑数据表

其他答案参考已弃用的reshape2软件包

tal*_*lat 5

下面是一个例子:

# example matrix
m = matrix(1:12, nrow = 4)

# load data table
library(data.table)
Run Code Online (Sandbox Code Playgroud)

我们可以直接提取数据、行和列信息,它应该非常快:

dt = data.table(
  row = rep(seq_len(nrow(m)), ncol(m)), 
  col = rep(seq_len(ncol(m)), each = nrow(m)), 
  value = c(m)
)
Run Code Online (Sandbox Code Playgroud)

结果是:

    row col value
 1:   1   1     1
 2:   2   1     2
 3:   3   1     3
 4:   4   1     4
 5:   1   2     5
 6:   2   2     6
 7:   3   2     7
 8:   4   2     8
 9:   1   3     9
10:   2   3    10
11:   3   3    11
12:   4   3    12
Run Code Online (Sandbox Code Playgroud)


Yan*_*oto 1

2年后...

由于reshape2已退休并且我不想使用tidyr(或除基本函数之外的任何内容data.table),我最终得到了以下解决方案:

# binds row and column names from matrix with their values
cbind(
  # We want a data.table as result
  as.data.table(
    # Cartesian product of matrix row and column names
    # returns a data.frame with 2 column
    expand.grid(rownames(m), colnames(m))
  ),
  # Store matrix value into a vector:
  # first all values from 1st column, then 2nd, and so on
  value = as.vector(m)
)
Run Code Online (Sandbox Code Playgroud)

注意:如果你的矩阵列或行没有命名或者你只是不关心它,你应该用expand.grid(...)这一行替换:

expand.grid(c(1:nrow(m)), c(1:ncol(m)))
Run Code Online (Sandbox Code Playgroud)

例如,当您有相关矩阵时,名称是相关的。