我有一个大矩阵 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软件包
下面是一个例子:
# 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)
由于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)
例如,当您有相关矩阵时,名称是相关的。
| 归档时间: |
|
| 查看次数: |
300 次 |
| 最近记录: |