将具有DIMNAME的矩阵转换为长格式data.frame

将具有DIMNAME的矩阵转换为长格式data.frame,r,dataframe,transformation,data.table,reshape,R,Dataframe,Transformation,Data.table,Reshape,希望这里有一个简单的答案,但我在任何地方都找不到 我有一个带有行名和列名的数字矩阵: # 1 2 3 4 # a 6 7 8 9 # b 8 7 5 7 # c 8 5 4 1 # d 1 6 3 2 我想将矩阵分解成一个长格式,在一列中包含值,在每列中包含矩阵行和列名。结果可以是如下所示的data.table或data.frame: # col row value

希望这里有一个简单的答案,但我在任何地方都找不到

我有一个带有行名和列名的数字矩阵:

#      1    2    3    4
# a    6    7    8    9
# b    8    7    5    7
# c    8    5    4    1
# d    1    6    3    2
我想将矩阵分解成一个长格式,在一列中包含值,在每列中包含矩阵行和列名。结果可以是如下所示的
data.table
data.frame

#  col  row  value
#    1    a      6
#    1    b      8
#    1    c      8
#    1    d      1
#    2    a      7
#    2    c      5
#    2    d      6
    ...

任何提示均受欢迎。

请使用重塑2的
melt

library(reshape2)
#Fake data
x <- matrix(1:12, ncol = 3)
colnames(x) <- letters[1:3]
rownames(x) <- 1:4
x.m <- melt(x)
x.m

   Var1 Var2 value
1     1    a     1
2     2    a     2
3     3    a     3
4     4    a     4
...
library(重塑2)
#假数据

假设‘m’是你的矩阵

data.frame(col = rep(colnames(m), each = nrow(m)), 
           row = rep(rownames(m), ncol(m)), 
           value = as.vector(m))

这在一个大矩阵上执行得非常快,还向您展示了矩阵是如何生成的,如何访问其中的内容,以及如何构造自己的向量。

as.table
as.data.frame
函数结合在一起可以实现以下功能:

> m <- matrix( sample(1:12), nrow=4 )
> dimnames(m) <- list( One=letters[1:4], Two=LETTERS[1:3] )
> as.data.frame( as.table(m) )
   One Two Freq
1    a   A    7
2    b   A    2
3    c   A    1
4    d   A    5
5    a   B    9
6    b   B    6
7    c   B    8
8    d   B   10
9    a   C   11
10   b   C   12
11   c   C    3
12   d   C    4
>m dimnames(m)as.data.frame(as.table(m))
一二频
1 a 7
2 b A 2
3 c A 1
4 d A 5
5 a B 9
6 b 6
7 c B 8
8 d B 10
9 a C 11
10 b C 12
11 c 3
12 d C 4

一种不要求您了解任何存储结构的修改,如果您使用
dimnames
slice.index
功能,它可以轻松扩展到高维阵列:

data.frame(row=rownames(m)[as.vector(row(m))],
           col=colnames(m)[as.vector(col(m))],
           value=as.vector(m))

未来的搜索者:请看这里的反面:这很有趣,谢谢。对于1k x 1k矩阵,我的机器上发布的所有三个解决方案都在2%以内。好的+1,这是我的新解决方案。。。这很少见。as.data.frame.default(x[[i]],optional=TRUE)中的错误:无法将类的结构(“dpoMatrix”,package=“Matrix”)强制为data.frame