希望这里有一个简单的答案,但我在任何地方都找不到。
我有一个带有行名称和列名称的数字矩阵:
# 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
...
任何提示表示赞赏。
使用 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
...
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”是你的矩阵...
data.frame(col = rep(colnames(m), each = nrow(m)),
row = rep(rownames(m), ncol(m)),
value = as.vector(m))
这在大型矩阵上执行得非常快,并且还向您展示了一些有关如何制作矩阵、如何访问其中的内容以及如何构建自己的向量的信息。
这种修改不需要您了解任何有关存储结构的信息,并且如果您使用
dimnames
和 slice.index
函数,则可以轻松扩展到高维数组:
data.frame(row=rownames(m)[as.vector(row(m))],
col=colnames(m)[as.vector(col(m))],
value=as.vector(m))
提供数据
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