15

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

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

#      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
    ...

任何提示表示赞赏。

4

4 回答 4

20

melt从 reshape2使用:

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
...
于 2012-04-19T18:51:14.757 回答
18

和函数一起执行此操作as.tableas.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
于 2012-04-19T19:44:48.573 回答
11

假设'm'是你的矩阵......

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

这在大型矩阵上执行得非常快,并且还向您展示了一些关于如何制作矩阵、如何访问其中的内容以及如何构建自己的向量的信息。

于 2012-04-19T19:00:03.323 回答
1

不需要您了解任何有关存储结构的修改,并且如果您使用dimnames, 和slice.index函数,它可以轻松扩展到高维数组:

data.frame(row=rownames(m)[as.vector(row(m))],
           col=colnames(m)[as.vector(col(m))],
           value=as.vector(m))
于 2021-02-21T13:01:06.590 回答