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

Я пытаюсь проанализировать данные с разделителями табуляции, которые были сохранены в виде текстового файла с посторонними данными. Я хотел бы, чтобы это был 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
... 

Ответы [ 2 ]

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

Вы можете запускать команды оболочки, используя fread. В 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")
0 голосов
/ 13 мая 2018

Один из способов - прочитать ваши данные с помощью 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)]
...