R:将不完全矩阵转换为两列或三列

R: Convert an incomplete matrix to two or three columns

如果我有 table

ID   C1   C2   C3   C4   C5
 1                     
 2    HD   NS   VM          
 3                   DH   FV
 4    HD             DH     

现在我必须把它转换成下面的形式table

ID  C
2   HD
2   NS
2   VM
3   DH
3   FV
4   HD
4   DH

在 R 中进行这种转换的最佳方法是什么?这必须作为更大代码的一部分在 R 中完成吗?

我们可以使用dplyrtidyr

library(dplyr)
library(tidyr)

dt2 <- dt %>%
  gather(C, Value, -ID, na.rm = TRUE) %>%
  select(-C) %>%
  arrange(ID)
dt2
  ID Value
1  2    HD
2  2    NS
3  2    VM
4  3    DH
5  3    FV
6  4    HD
7  4    DH

数据

dt <- read.table(text = "ID   C1   C2   C3   C4   C5
 1 NA NA NA NA NA                    
                 2    HD   NS   VM NA NA           
                 3    NA  NA  NA  DH FV
                 4    HD  NA NA   DH NA     ",
                 header = TRUE, stringsAsFactors = FALSE)

使用melt

library(reshape)
na.omit(melt(dt,id.var='ID'))
   ID variable value
2   2       C1    HD
4   4       C1    HD
6   2       C2    NS
10  2       C3    VM
15  3       C4    DH
16  4       C4    DH
19  3       C5    FV
data <- as.data.frame(list(ID = c(1,2,3,4),
              C1 = c(NA,"HD",NA,"HD"),C2 = c(NA,"NS",NA,NA),C3 = c(NA,"VM",NA,NA),C4 = c(NA,NA,"DH","DH"), C5 = c(NA,NA,"FV",NA)))

您可以使用 unlist,但要获得 ID,您之前需要创建一个与数据大小相同的矩阵,只需使用 IDS

plouf = matrix(data$ID,dim(data)[1],dim(data)[2]-1)
data$ID <- NULL

然后使用 unlist 和 select 非 NA 数据:

   result = as.data.frame(list(
  C = unlist(data)[!is.na(unlist(data,use.names = FALSE))], 
  ID = unlist(plouf)[!is.na(unlist(data))] ))

导致:

 C ID
C12 HD  2
C14 HD  4
C22 NS  2
C32 VM  2
C43 DH  3
C44 DH  4
C53 FV  3