将矩阵转换为r中的数据帧

时间:2018-04-25 15:14:39

标签: r dataframe matrix dplyr

我正在尝试将矩阵转换为数据框,并使用数据框中的变量在矩阵中使用列名和行名。
这是样本

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]

我的数据集有很多NA,因此我尝试删除数据框中的所有NA

所以这是我渴望的输出,

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

3 个答案:

答案 0 :(得分:5)

使用reshape2包中的melt进行重新整形,然后清除NA。最后,做一些格式化的东西来获得你想要的输出(订购,设置colnames ......)。

> 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

使用dplyr和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

答案 1 :(得分:3)

通过复制行名和列名

,这是一个base R方法
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

答案 2 :(得分:0)

这使用了tidyverse中的几个包,包括tidyr和dplyr。我将您的数据重命名为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