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