我有一个大的 n × m 矩阵,我想将其转换为 (n * m) × 3 数据框(我的矩阵类似于 1400 × 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]]
}
最佳答案
我们可以使用row
/col
获取矩阵中每个值的行和列值,并将矩阵折叠成向量以获得实际值和cbind
将它们全部绑定(bind)在一起。
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))
关于 reshape 矩阵并将其转换为数据框,跟踪原始行和列索引,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55706270/