2016-07-19 6 views
1

Допустим, у меня есть матрица mat которая имеет как имена столбцов и имена строк:Transform Имена Матрицу в ряды Dataframe

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, чтобы он мог анализировать несколько матриц и создавать data.frame, на самом деле это 4 столбца и столько наблюдений, сколько значений в все матрицы объединены. Если есть ярлык для любого из этих шагов, это будет очень признательно.

ответ

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 
+0

'reshape2' пакет? – Adam

+1

@Adam Это правда. Благодаря! – Psidom

+0

Это также работает рекурсивно, если я передам ему именованный список элементов. Это именно то, что мне нужно! – Adam

2

Попробуйте

df = expand.grid(rownames(mat),colnames(mat)) 
df$val = as.vector(mat) 
3

Использование 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:

library(data.table) 

melt(setDT(mat), id.vars = 6, measure.vars = 1:5, 
    variable.name = "COLNAME", value.name = "VALUE") 
1

Мы можем сделать это без каких-либо пакетов. Мы копируем rownames и colnames и элементы «мата» и создаем 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)) 
Смежные вопросы