重塑矩阵并将其转换为跟踪原始行和列索引的数据帧

时间:2019-04-16 10:42:00

标签: r

我有一个大的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]]
}

2 个答案:

答案 0 :(得分: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))

答案 1 :(得分:1)

我们可以使用-1

0111 1111 1111 1111 1111 1111 1111 1111 1111 1111 1111 1111 1111 1111 1111 1111

数据

0111 1111 1111 1111 1111 1111 1111 1111 1111 1111 1111 1111 1111 1111 1111 1111
7    f    f    f    f    f    f    f    f    f    f    f    f    f    f    f