Как исключить определенные строки при разборе данных с разделителями табуляции в R data.table / data.frame? - PullRequest
0 голосов
/ 13 мая 2018

Этот вопрос относится к следующему вопросу:

Как преобразовать данные с разделителями табуляции (разных форматов) в 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
...

Однако в текстовом файле есть несколько длинных строк, которые технически разделены табуляцией, но являются длинными строками. например строки 'Z' и 'Y' здесь

Z  FX:E:4.2
Y   23434M,23434M,23434M,23434M,23434M,23434M,23434M,23434M,23434M,23434M,23434M,23434M,23434M,23434M,23434M,23434M,23434M,23434M,23434M,23434M,23434M,23434M,23434M,23434M,23434M,23434M,23434M,23434M,23434M,23434M,23434M,23434M,23434M,23434M,23434M,23434M,23434M,23434M,23434M,23434M,23434M,23434M,23434M,23434M,23434M,23434M,23434M,23434M,23434M,23434M,23434M,23434M,23434M,23434M,23434M,23434M,23434M,23434M,23434M,23434M,23434M,23434M,23434M,23434M,23434M,23434M,23434M,23434M,23434M,23434M 
A   1092    -   1093    +   1X
B   1093    HRDCPMRFYT
A   1093    +   1094    -   1X
B   1094    BSZSDFJRVF
A   1094    +   1095    +   1X
B   1095    SSTFCLEPVV
...

В этом текстовом файле есть раздел, в котором Y 23434M,23434M,... может иметь длину несколько ГБ.

Эти строки встречаются исключительно редко и помечаются только предшествующими Z или Y. В настоящее время я открыл файл в текстовом редакторе и удалил эти строки.

Однако это не является алгоритмически обоснованным. Можно ли проанализировать этот файл так, чтобы (1) использовались только строки A и B или (2) строки Z и Y явно не использовались?

РЕДАКТИРОВАТЬ: Чтобы уточнить, Z это не длинная строка. Только «Y» здесь длинная строка. является строкой формата X XX:X:0.0, где X является символом, а 0 является целым числом.

1 Ответ

0 голосов
/ 14 мая 2018

Вы можете сделать системный вызов, чтобы зафиксировать файл, используя, скажем, sed, по определенной схеме. Если вы хотите удалить все строки, которые начинаются с Z или Y, вы можете просто передать выражение регулярного выражения, за которым следует /d

system("sed -i '/^[ZY]/d' test.tab")

Команда выше удалит все строки, которые начинаются с Z или Y из вашего файла. Затем вы можете запустить тот же код, который я разместил в вашем предыдущем вопросе

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

Данные

text <- "Z FX:E:4.2
Y  23434M,23434M,23434M,23434M,23434M,23434M,23434M,23434M,23434M,23434M,23434M,23434M,23434M,23434M,23434M,23434M,23434M,23434M,23434M,23434M,23434M,23434M,23434M,23434M,23434M,23434M,23434M,23434M,23434M,23434M,23434M,23434M,23434M,23434M,23434M,23434M,23434M,23434M,23434M,23434M,23434M,23434M,23434M,23434M,23434M,23434M,23434M,23434M,23434M,23434M,23434M,23434M,23434M,23434M,23434M,23434M,23434M,23434M,23434M,23434M,23434M,23434M,23434M,23434M,23434M,23434M,23434M,23434M,23434M,23434M 
A   1092    -   1093    +   1X
B   1093    HRDCPMRFYT
A   1093    +   1094    -   1X
B   1094    BSZSDFJRVF
A   1094    +   1095    +   1X
B   1095    SSTFCLEPVV"

# Saving it as tab separated file on disk
write(gsub(" +", "\t", text), file = "test.tab")
...