web-dev-qa-db-fra.com

convertir une matrice en dataframe en r

J'essaie de convertir une matrice en un cadre de données et d'utiliser un nom de colonne et un nom de ligne dans la matrice avec des variables dans le cadre de données. 
voici l'échantillon 

sample = matrix(c(1,NA,NA,2,NA,3,NA,NA,5,NA,NA,6,NA,NA,NA,NA,8,NA,3,1),ncol = 4)
colnames(sample) = letters[1:4]
row.names(sample) = letters[22:26]

Mon ensemble de données contient beaucoup de NA et j'essaie donc de supprimer tous les NA de la trame de données.

alors voici ma sortie désirante,

 data.frame(col = c("v","v","w","w","y","y","y","z"),
           row = c("a","b","c","c","a","b","d","d"), 
           value = c(1,3,6,8,2,5,3,1))
4
John legend2

Utilisez melt du paquet reshape2 pour le remodelage, puis effacez NA. Enfin, effectuez des opérations de formatage pour obtenir le résultat souhaité (classement, définition des noms de fichier, etc.).

> library(reshape2)
> df <- na.omit(melt(sample))  # reshaping
> df <- df[order(df$Var1), ]   # ordering
> colnames(df) <- c("col", "row", "value") # setting colnames
> df                           # getting desired output
   col row value
1    v   a     1
6    v   b     3
12   w   c     6
17   w   d     8
4    y   a     2
9    y   b     5
19   y   d     3
20   z   d     1

Avec dplyr et magrittr

> library(magrittr)
> library(dplyr)
> sample %>%  melt %>% 
    na.omit %>% 
    arrange(., Var1) %>%
    setNames(c('col', 'row', 'value'))

 col row value
1   v   a     1
2   v   b     3
3   w   c     6
4   w   d     8
5   y   a     2
6   y   b     5
7   y   d     3
8   z   d     1
5
Jilber Urbina

Voici une méthode base R en répliquant les noms de ligne et les noms de colonne

out <- na.omit(data.frame(col = rownames(sample)[row(sample)],
     row = colnames(sample)[col(sample)], value = c(sample)))
out <- out[order(out$col),]
row.names(out) <- NULL
out
#  col row value
#1   v   a     1
#2   v   b     3
#3   w   c     6
#4   w   d     8
#5   y   a     2
#6   y   b     5
#7   y   d     3
#8   z   d     1
3
akrun

Cela utilise plusieurs paquets dans tidyverse, y compris tidyr et dplyr. J'ai renommé vos données en mysample.

install.packages("tidyverse")
library(tidyverse)

mysample <- data.frame(mysample)
mysample$rowname <- rownames(mysample)
noNAs <- mysample %>%
  gather("colname","value",1:4) %>%
  drop_na() %>%
  arrange(colname)
noNAs

       rowname colname value
1        v       a     1
2        y       a     2
3        v       b     3
4        y       b     5
5        w       c     6
6        w       d     8
7        y       d     3
8        z       d     1
0
Jerome Dineen