如何将不同格式的制表符分隔数据解析为 data.table/data.frame?

4
我正在尝试解析以制表符分隔的数据,该数据已保存为带有多余数据的文本文件。我希望将其转换为R数据表/数据框。
制表符分隔格式如下:
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数据表?我的想法是创建以下格式:
1092    -    1093    +    1X    1093    HRDCPMRFYT
1093    +    1094    -    1X    1094    BSZSDFJRVF
1094    +    1095    +    1X    1095    SSTFCLEPVV
... 

只是确认一下:您想将偶数行附加到奇数行(它们总是交替的吗?),以创建七列? - user20650
@user20650 是的,这是做这件事的首选方式。如果创建两个数据表"A"和"B"更容易,那也会很有用。 - ShanZhengYang
2个回答

5

您可以使用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 语法取自此处


数据

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

4

一种方法是使用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)]

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接