【问题标题】:How to parse tab-delimited data (of different formats) into a data.table/data.frame?如何将制表符分隔的数据(不同格式)解析为 data.table/data.frame?
【发布时间】:2018-10-23 06:22:23
【问题描述】:

我正在尝试解析制表符分隔的数据,该数据已保存为包含无关数据的文本文件。我希望这是一个 R data.table/data.frame。

制表符分隔格式如下:

A   1092    -   1093    +   1X
B   1093    HRDCPMRFYT
A   1093    +   1094    -   1X
B   1094    BSZSDFJRVF
A   1094    +   1095    +   1X
B   1095    SSTFCLEPVV
...

只有两种类型的行,A 和 B。A 始终有 5 列,例如对于第一行,

1092    -   1093    +   1X

B 始终有两列:

1093    HRDCPMRFYT

问题:如何解析具有不同格式的“交替”行的文件?

假设这是一个只有这种格式的文本文件,A 行和 B 行交替,分别有 5 列和 2 列。您如何将其解析为 R data.table?我的想法是如何创建以下格式:

1092    -    1093    +    1X    1093    HRDCPMRFYT
1093    +    1094    -    1X    1094    BSZSDFJRVF
1094    +    1095    +    1X    1095    SSTFCLEPVV
... 

【问题讨论】:

  • 只是为了确认:您想将偶数行附加到奇数行(它们总是交替的吗?),以创建七列?
  • @user20650 是的,这是最好的方法。如果创建两个data.tables“A”和“B”更容易,我认为这也会很有用

标签: r parsing data.table csv


【解决方案1】:

一种方法是使用readLines 读入您的数据,取出您想要的位,然后传递给read.table 以形成数据帧。因此,如果行是交替的,那么:

txt <- 
'1092    -   1093    +   1X
1093    HRDCPMRFYT
1093    +   1094    -   1X
1094    BSZSDFJRVF
1094    +   1095    +   1X
1095    SSTFCLEPVV'


rd <- readLines(textConnection(txt))
data.frame(read.table(text=rd[c(TRUE, FALSE)]), 
           read.table(text=rd[c(FALSE, TRUE)]))

textConnection(txt) 更改为您的文件路径


另一种方法是只读取一次,然后进行后期处理

r <- read.table(text=txt, fill=TRUE, stringsAsFactors=FALSE, na.strings = "")
d <- cbind(r[c(TRUE, FALSE),], r[c(FALSE, TRUE),])
d[ colSums(is.na(d)) < nrow(d)]

【讨论】:

    【解决方案2】:

    您可以使用 fread 运行 shell 命令。在Win10中,你甚至可以运行一些linux实用程序如sed

    因此,您可以简单地做

    fread("sed '$!N;s/\\n/ /' test.tab")
    #      V1 V2   V3 V4      V5         V6
    # 1: 1092  - 1093  + 1X 1093 HRDCPMRFYT
    # 2: 1093  + 1094  - 1X 1094 BSZSDFJRVF
    # 3: 1094  + 1095  + 1X 1095 SSTFCLEPVV
    

    (sed 语法取自here


    数据

    text <- "1092    -   1093    +   1X
    1093    HRDCPMRFYT
    1093    +   1094    -   1X
    1094    BSZSDFJRVF
    1094    +   1095    +   1X
    1095    SSTFCLEPVV"
    
    # Saving it as tab separated file on disk
    write(gsub(" +", "\t", text), file = "test.tab")
    

    【讨论】:

      猜你喜欢
      • 2018-10-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-06-19
      • 1970-01-01
      • 1970-01-01
      • 2014-12-23
      相关资源
      最近更新 更多