假设我有一个矩阵mat
,它有列名和行名:
mat <- matrix(1:25, ncol = 5)
rownames(mat) <- LETTERS[1:5]
colnames(mat) <- LETTERS[6:10]
^^制作以下矩阵的简单且可重复的示例:
F G H I J
A 1 6 11 16 21
B 2 7 12 17 22
C 3 8 13 18 23
D 4 9 14 19 24
E 5 10 15 20 25
我需要将此矩阵转换为如下所示的数据框:
ROWNAME COLNAME VALUE
A F 1
B F 2
C F 3
......
是否有内置功能来执行此操作?我该如何解决这个问题。
此外,此矩阵将是众多矩阵中的一个,因此需要添加Matrix Name
列,以便它可以解析多个矩阵并创建一个实际为4列且具有多个观察值的data.frame作为所有矩阵中的值的组合。如果有任何这些步骤的快捷方式,我们将不胜感激。
答案 0 :(得分:3)
使用Sub Worksheet_SelectionChange(ByVal Target As Range)
Row = Target.Row
Column= "E"
Path= Range(Column & Row)
If Target.Column = "5" Then
Shell """" & Environ("ProgramFiles") & "\Adobe\Acrobat Reader 2015\Reader\AcroRd32.exe"" /A ""page=2"" """ & Path & """", vbNormalFocus
End If
End Sub
:
tidyr
使用mat <- matrix(1:25, ncol = 5)
rownames(mat) <- LETTERS[1:5]
colnames(mat) <- LETTERS[6:10]
mat <- as.data.frame(mat)
mat$ROWNAME <- rownames(mat)
library(tidyr)
mat %>% gather(COLNAME, VALUE, F:J)
ROWNAME COLNAME VALUE
1 A F 1
2 B F 2
3 C F 3
4 D F 4
5 E F 5
6 A G 6
7 B G 7
...
:
data.table
答案 1 :(得分:2)
试试这个
df = expand.grid(rownames(mat),colnames(mat))
df$val = as.vector(mat)
答案 2 :(得分:2)
您可以使用melt
:
library(reshape2)
melt(mat)
head(setNames(melt(mat), c("ROWNAME", "COLNAME", "VALUE")))
# ROWNAME COLNAME VALUE
# 1 A F 1
# 2 B F 2
# 3 C F 3
# 4 D F 4
# 5 E F 5
# 6 A G 6
答案 3 :(得分:1)
我们可以在没有任何包的情况下做到这一点我们复制了rownames
和colnames
以及'mat'的元素并创建了data.frame
。
data.frame(ROWNAME = rownames(mat)[row(mat)],
COLNAME = colnames(mat)[col(mat)],
VALUE = c(mat))
# ROWNAME COLNAME VALUE
#1 A F 1
#2 B F 2
#3 C F 3
#4 D F 4
#5 E F 5
#6 A G 6
#7 B G 7
#8 C G 8
#9 D G 9
#10 E G 10
#11 A H 11
#12 B H 12
#13 C H 13
#14 D H 14
#15 E H 15
#16 A I 16
#17 B I 17
#18 C I 18
#19 D I 19
#20 E I 20
#21 A J 21
#22 B J 22
#23 C J 23
#24 D J 24
#25 E J 25
或者如果我们需要更快的方法,使用Matrix
的选项将是
library(Matrix)
summary(Matrix(mat, sparse=TRUE))