【问题标题】:R: Convert an incomplete matrix to two or three columns [duplicate]R:将不完整的矩阵转换为两列或三列[重复]
【发布时间】:2017-10-26 14:16:11
【问题描述】:

如果我有一张桌子

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 中作为更大代码的一部分来完成?

【问题讨论】:

  • 试试unlist之类的(如果是数据框的话)
  • 您的表格的格式/类型是什么?

标签: r dataframe matrix reshape


【解决方案1】:

我们可以使用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)

【讨论】:

  • 谢谢,效果很好。我应该补充一点,它的格式是 cvs,所以我必须以dt &lt;- read.csv2("~/Desktop/R_class/Test.data.csv", sep=",", header=TRUE, stringsAsFactors = FALSE, na.strings=c("","NA")) 下面的方法上传表格,添加na.strings=c("","NA")
【解决方案2】:
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 并选择非 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

【讨论】:

    【解决方案3】:

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

    【讨论】:

    • @DavidArenburg 已更改
    猜你喜欢
    • 2015-01-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-06-10
    • 1970-01-01
    • 2017-06-17
    • 2017-12-22
    • 1970-01-01
    相关资源
    最近更新 更多