我正在尝试将矩阵转换为数据框,并使用数据框中的变量在矩阵中使用列名和行名。
这是样本
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))
答案 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