reshape 矩阵并将其转换为数据框,跟踪原始行和列索引

标签 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]]
}

最佳答案

我们可以使用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/

相关文章:

r - 如何避免 igraph 中的图形联合名称冲突?

python - 有没有内置MSMOTE

r - 如何使用 dplyr 管道根据向量对数据框的行进行排序

r - 将 ls 中的多个 ggplots 保存到 R 中的一个和单独的文件中

r - Shiny 的 R 操作按钮控制 react 元素

r - R中多边形内点(shapefile)的选择和提取

r - 将两个饼图合二为一

r - 将行作为代码写入、读取到 csv 文件中

R环境和函数调用栈

r - 使用 ggplot2 生成 "fuzzy"RD 图