Чтение полуструктурированного текстового файла в R - PullRequest
3 голосов
/ 14 декабря 2011

У меня есть текстовый файл с разделителями табуляцией, который я хотел бы прочитать в R. Этот файл я бы назвал «полуструктурированным», то есть большая часть файла состоит из фреймов данных (300+) идентичных размер (32 * 30), с именами столбцов и строк. В строке, предшествующей каждому фрейму данных, есть уникальный идентификатор для этого фрейма данных (ID1 ... и т. Д.), А между каждым фреймом данных есть пустая строка.

Я попытался прочитать файл в R следующим образом:

read.table(file = "my.file", header = TRUE, sep = "\t",
    na.strings = " ",  blank.lines.skip = FALSE)

, который работал нормально, но весь файл читается как уровни в одном факторе. В идеале, мне бы очень хотелось, чтобы данные в списке, где каждый фрейм данных имел элемент в списке, и уникальные идентификаторы в качестве ключей для каждого элемента списка. Вот пример только двух матриц с начала файла, считанного с помощью вышеуказанной команды (хотя они представлены как один фактор, форма данных такая же, как в текстовом файле). Любые идеи о том, как я могу прочитать это и преобразовать в список?

Ind <- structure(list(ID.1 = structure(c(2L, 43L, 41L, 39L, 37L, 35L, 
33L, 31L, 30L, 29L, 28L, 27L, 26L, 25L, 22L, 20L, 18L, 17L, 16L, 
15L, 14L, 13L, 12L, 11L, 10L, 9L, 8L, 7L, 6L, 4L, 3L, 1L, 5L, 
2L, 43L, 42L, 40L, 38L, 36L, 34L, 32L, 30L, 29L, 28L, 27L, 26L, 
24L, 23L, 21L, 19L, 17L, 16L, 15L, 14L, 13L, 12L, 11L, 10L, 9L, 
8L, 7L, 6L, 4L, 3L), .Label = c("", "       66.5E 67.5E 68.5E 69.5E 70.5E 71.5E 72.5E 73.5E         74.5E 75.5E 76.5E 77.5E 78.5E 79.5E 80.5E 81.5E 82.5E 83.5E 84.5E 85.5E 86.5E 87.5E     88.5E 89.5E     90.5E 91.5E 92.5E 93.5E 94.5E 95.5E 96.5E 97.5E", 
"  8.5N                                                               0.0   0.0       0.0                                                                                                                      ", 
"  9.5N                                                               0.0   0.0   0.0       0.0                                                                                                                ", 
"  ID=2", " 10.5N                                                         0.0   0.0   0.0       0.0       0.0                                                                                                                    ", 
" 11.5N                                                         0.0   0.0   0.0   0.0       0.0                                                                                                                ", 
 " 12.5N                                                   0.0   0.0   0.0   0.0   0.0   0.0           0.0                                                                                                          ", 
" 13.5N                                                   0.0   0.0   0.0   0.0   0.0       0.0            0.0                                                                                                          ", 
" 14.5N                                                   0.0   0.0   0.0   0.0   0.0   0.0           0.0                                                                                                          ", 
" 15.5N                                             0.0   0.0   0.0   0.0   0.0   0.0   0.0           0.0                                                                                                          ", 
" 16.5N                                             0.0   0.0   0.0   0.0   0.0   0.0   0.0       0.0   0.0       0.0                                                                                          ", 
" 17.5N                                             0.0   0.0   0.0   0.0   0.0   0.0   0.0       0.0   0.0   0.0       0.0                                                                                    ", 
" 18.5N                                       0.0   0.0   0.0   0.0   0.0   0.0   0.0   0.0       0.0   0.0   0.0   0.0       0.0                                                                              ", 
" 19.5N                                       0.0   0.0   0.0   0.0   0.0   0.0   0.0   0.0       0.0   0.0   0.0   0.0   0.0       0.0                                                                        ", 
" 20.5N                           0.0   0.0   0.0   0.0   0.0   0.0   0.0   0.0   0.0   0.0       0.0   0.0   0.0   0.0   0.0   0.0       0.0                                                                  ", 
" 21.5N                     0.0   0.0   0.0   0.0   0.0   0.0   0.0   0.0   0.0   0.0   0.0       0.0   0.0   0.0   0.0   0.0   0.0   0.0   0.0       0.0                                                      ", 
" 22.5N                     0.0   0.0   0.0   0.0   0.0   0.0   0.0   0.0   0.0   0.0   0.0       0.0   0.0   0.0   0.0   0.0   0.0   0.0   0.0   0.0                         0.0                              ", 
" 22.5N                     0.0   0.0   0.0   0.0   0.0   0.0   0.0   0.3   0.0   0.0   0.0        0.0   0.0   0.0   0.0   0.0   0.0   0.0   0.0   0.0                          0.0                              ", 
" 23.5N               0.0   0.0   0.0   0.0   0.0   0.0   0.0   0.0   0.0   0.0   0.0   0.0       0.0   0.0   0.0   0.0   0.0   0.0   0.0   0.0   0.0               0.0   0.0       0.0                        ", 
" 23.5N               0.0   0.0   0.0   0.0   0.0   0.0   0.0   0.1   1.5   0.3   0.0   0.0       0.0   0.0   0.0   0.0   0.0   0.0   0.0   0.0   0.0               0.0   0.0       0.0                        ", 
" 24.5N               0.0   0.0   0.0   0.0   0.0   0.0   0.0   0.0   0.0   0.0   0.0   0.0       0.0   0.0   0.0   0.0   0.0   0.0   0.0   0.0   0.0               0.0   0.0   0.0       0.0                  ", 
" 24.5N               0.0   0.0   0.0   0.0   0.0   0.0   0.0   0.0   0.0   0.9   0.0   0.0       0.0   0.0   0.0   0.0   0.0   0.0   0.0   0.0   0.0               0.0   0.0   0.0       0.0                  ", 
" 25.5N                           0.0   0.0   0.0   0.0   0.0   0.0   2.2   0.0   0.0   0.0       0.0   0.0   0.0   0.0   0.0   0.0   0.0   0.0   0.0         0.0   0.0   0.0   0.0       0.0                  ", 
" 25.5N                           0.0   0.0   0.0   0.0   0.0   1.6   0.0   0.0   0.0   0.0       0.0   0.0   0.0   0.0   0.0   0.0   0.0   0.0   0.0         0.0   0.0   0.0   0.0       0.0                  ", 
" 26.5N                           0.0   0.0   0.0   0.0   0.0   0.0   0.0   0.0   0.0   0.0       0.0   0.0   0.0   0.0   0.0   0.0   0.0   0.0   0.0   0.0   0.0   0.0   0.0   0.0   0.0        0.0            ", 
  " 27.5N                     0.0   0.0   0.0   0.0   0.0   0.0   0.0   0.0   0.0   0.0   0.0       0.0   0.0   0.0   0.0   0.0                     0.0   0.0   0.0   0.0   0.0   0.0   0.0       0.0   0.0   0.0", 
" 28.5N                           0.0   0.0   0.0   0.0   0.0   0.0   0.0   0.0   0.0   0.0        0.0   0.0                                       0.0               0.0   0.0   0.0   0.0        0.0   0.0   0.0", 
" 29.5N                                       0.0   0.0   0.0   0.0   0.0   0.0   0.0   0.0        0.0                                                                                 0.0       0.0   0.0      ", 
" 30.5N                                             0.0   0.0   0.0   0.0   0.0   0.0   0.0           0.0                                                                                                          ", 
" 31.5N                                                   0.0   0.0   0.0   0.0   0.0       0.0                                                                                                                ", 
" 31.5N                                                   0.0   0.0   0.0   2.9   4.6       4.5                                                                                                                ", 
" 32.5N                                                   0.0   0.0   0.0   0.0   0.0       0.0                                                                                                                 ", 
" 32.5N                                                   0.0   0.0   0.0   1.2   5.4       4.2                                                                                                                ", 
" 33.5N                                             0.0   0.0   0.0   0.0   0.0   0.0       0.0                                                                                                                ", 
" 33.5N                                             0.0   0.0   0.0   0.0   0.9   0.7       2.5                                                                                                                ", 
" 34.5N                                             0.0   0.0   0.0   0.0   0.0   0.0       0.0                                                                                                                ", 
" 34.5N                                             0.0   0.0   0.0   0.0   0.4   0.6       1.5                                                                                                            ", 
" 35.5N                                             0.0   0.0   0.0   0.0   0.0   0.0   0.0       0.0                                                                                                          ", 
" 35.5N                                             0.0   0.0   0.0   0.0   0.2   0.4   1.0       1.6                                                                                                           ", 
 " 36.5N                                       0.0   0.0   0.0   0.0               0.0       0.0                                                                                                                ", 
" 36.5N                                       0.0   0.0   0.0   0.0               0.3       0.6                                                                                                                ", 
"     37.5N                                                                                                                                                                                                    "
), class = "factor")), .Names = "ID.1", class = "data.frame", row.names = c(NA, 
-64L))

(В прочитанных данных имена строк все выстроены в линию - я испортил это с отступом в коде).

Ответы [ 2 ]

3 голосов
/ 14 декабря 2011

Используйте аргументы skip и nrows для read.table, чтобы контролировать, какие части файла читаются.

start_rows <- seq(2, by = 35, length.out = 300)
data_list <- lapply(start_rows, function(skip) 
{
  read.table(<as before>, skip = skip, nrows = 32) 
})

Вы можете получить имена наборов данных аналогичным образом, используя scan.

name_rows <- start_rows - 1
data_names <- sapply(name_rows, function(skip) 
{
  scan(the_file, character(), n = 1, nlines = 1, skip = skip)
})
names(data_list) <- data_names

В качестве вспомогательной точки кода, поменяйте местами read.table на read.delim, так как вы используете файл с разделителями табуляции.


Как указал Spacedman, в этом решении есть проблемы со скоростью. Я не знаю, будут ли они большой проблемой с таким большим количеством данных, но это, конечно, не будет слишком хорошо масштабироваться. Одним из решений является этап предварительной обработки, при котором вы используете readLines для считывания всего, затем повторный вызов writeLines для каждого блока строк с данными. Таким образом, каждый фрейм данных сохраняется в своем собственном файле, и вы можете работать с ним как обычно.

2 голосов
/ 14 декабря 2011

Если ваш файл действительно аккуратно упорядочен в 35 строковых блоков (32 строки данных плюс 3 разные строки заголовков и разделителей), то вы можете использовать readLines (), чтобы получить строку за раз, пропустить заголовки и разделители, прочитать 32 строки данных, используйте strsplit () для разделения данных в строках данных и т. Д.

Он немного грязный и полагается на то, что ваш файл точно такой, как указано (эти вещи редко бывают, вы всегда обнаружите, что 143-я вещь имеет две лишние строчки), но она справится с работой.

Это всего лишь несколько указателей, очевидно, вам нужно будет поработать, чтобы все заработало.

[Учитывая, что эти имена и строки выглядят как lat-long, вы можете рассмотреть возможность загрузки их в растровый стек, используя растровый пакет]

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...