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

时间:2017-10-26 14:16:12

标签: r dataframe matrix reshape

如果我有桌子

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

现在我必须将其转换为下表

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

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

3 个答案:

答案 0 :(得分:1)

我们可以使用C:\dplyr

tidyr

数据

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

答案 1 :(得分:1)

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

答案 2 :(得分:1)

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

您可以使用取消列表,但要获得该ID,您之前创建的数据矩阵与您的数据相同,只需使用IDS

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

然后使用取消列表并选择非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