将具有暗名称的矩阵转换为长格式 data.frame

问题描述 投票:0回答:5

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

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

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

任何提示表示赞赏。

r dataframe transformation data.table reshape
5个回答
21
投票

使用 reshape2 中的

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

19
投票

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

12
投票

假设“m”是你的矩阵...

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

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


2
投票

这种修改不需要您了解任何有关存储结构的信息,并且如果您使用

dimnames
slice.index
函数,则可以轻松扩展到高维数组:

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

0
投票

提供数据

testmat <- matrix(1:25,nrow=5,dimnames=list(LETTERS[6:10],LETTERS[1:5]))
#   A  B  C  D  E
# F 1  6 11 16 21
# G 2  7 12 17 22
# H 3  8 13 18 23
# I 4  9 14 19 24
# J 5 10 15 20 25

你可以试试

as.data.frame.table

> as.data.frame.table(testmat, stringsAsFactors = FALSE)
   Var1 Var2 Freq
1     F    A    1
2     G    A    2
3     H    A    3
4     I    A    4
5     J    A    5
6     F    B    6
7     G    B    7
8     H    B    8
9     I    B    9
10    J    B   10
11    F    C   11
12    G    C   12
13    H    C   13
14    I    C   14
15    J    C   15
16    F    D   16
17    G    D   17
18    H    D   18
19    I    D   19
20    J    D   20
21    F    E   21
22    G    E   22
23    H    E   23
24    I    E   24
25    J    E   25
© www.soinside.com 2019 - 2024. All rights reserved.