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