Разбор сложного текстового файла в R - PullRequest
0 голосов
/ 01 июня 2018

Я ищу, чтобы проанализировать текстовый файл в R для загрузки в качестве data.frame.У меня есть длинный текстовый файл с данными фиксированной ширины, разделенные по разделам (ID) и подразделам (SUB).Длина каждого раздела является переменной.Я ищу, чтобы создать два фрейма данных, один для раздела идентификатора и один для раздела SUB.Вот пример данных:

Header 1
METRIC       0.30    10.00
ID      K0107050 Aa
    0.06    15.24    14.40    14.40     7.13     0.13     0.19  1
    0.17    14.35    13.57    13.57     6.40     0.12     0.18  1

SUB
    1.000   1.000  0.093  0.11  0.11 301
    1.000   1.000  0.093  0.11  0.11  61
ID      K0129050 Aa
    0.06    26.35    24.90    24.90    10.88     0.62     0.88  1
    0.15    25.35    23.96    23.96    10.93     0.55     0.74  1

SUB
    3.000   3.000  0.506  0.53  0.53 102
    4.000   4.000  0.514  0.55  0.55 118

Я хотел бы получить следующие данные:

DF1

Header 1    K0107050    Aa    0.06    15.24    14.40    14.40     7.13     0.13     0.19  1
Header 1    K0107050    Aa    0.17    14.35    13.57    13.57     6.40     0.12     0.18  1
Header 1    K0129050    Aa    0.06    26.35    24.90    24.90    10.88     0.62     0.88  1
Header 1    K0129050    Aa    0.15    25.35    23.96    23.96    10.93     0.55     0.74  1

DF2

Header 1    K0107050    Aa  1.000   1.000  0.093  0.11  0.11 301
Header 1    K0107050    Aa  1.000   1.000  0.093  0.11  0.11  61
Header 1    K0129050    Aa  3.000   3.000  0.506  0.53  0.53 102
Header 1    K0129050    Aa  4.000   4.000  0.514  0.55  0.55 118

Я дошел до того, что использовал readLines (), но застрял после этого, учитывая различные разделы в текстовом файле.Спасибо

1 Ответ

0 голосов
/ 01 июня 2018

Вот начало (извините, время спать ...):

x <- readLines("myFile.txt")

library(dplyr)

bind_rows(
  lapply(split(x, cumsum(grepl("Header|Metric|ID|SUB", x))), function(i){
    i1 <- i[ i != "" ]  
    nums <- unlist(strsplit(tail(i1, -1), " "))
    res <- cbind.data.frame(Grp = i1[1],
                            matrix(na.omit(as.numeric(nums)),
                                   nrow = length(i1) - 1, byrow = TRUE),
                            stringsAsFactors = FALSE)

    res
  })
)

#                   Grp    1     2      3     4     5      6    7  8
# 1            Header 1 0.30 10.00     NA    NA    NA     NA   NA NA
# 2 ID      K0107050 Aa 0.06 15.24 14.400 14.40  7.13   0.13 0.19  1
# 3 ID      K0107050 Aa 0.17 14.35 13.570 13.57  6.40   0.12 0.18  1
# 4                 SUB 1.00  1.00  0.093  0.11  0.11 301.00   NA NA
# 5                 SUB 1.00  1.00  0.093  0.11  0.11  61.00   NA NA
# 6 ID      K0129050 Aa 0.06 26.35 24.900 24.90 10.88   0.62 0.88  1
# 7 ID      K0129050 Aa 0.15 25.35 23.960 23.96 10.93   0.55 0.74  1
# 8                 SUB 3.00  3.00  0.506  0.53  0.53 102.00   NA NA
# 9                 SUB 4.00  4.00  0.514  0.55  0.55 118.00   NA NA
...