Способы чтения только выбрать столбцы из файла в R? (Счастливая среда между `read.table` и` scan`?) - программирование
Подтвердить что ты не робот

Способы чтения только выбрать столбцы из файла в R? (Счастливая среда между `read.table` и` scan`?)

У меня есть очень большие файлы данных с разделителями и Я хочу обрабатывать только определенные столбцы в R, не занимая время и память, чтобы создать data.frame для всего файла.

Единственными параметрами, которые я знаю, являются read.table, которые очень расточительны, когда я хочу только пару столбцов или scan, которые кажутся слишком низкими для того, что я хочу.

Есть ли лучший вариант, либо с чистым R, либо, возможно, вызывать какую-либо другую оболочку script, чтобы выполнить извлечение столбца, а затем используя scan или read.table на выходе? (Это приводит к вопросу о том, как вызвать оболочку script и записать ее вывод в R?).

4b9b3361

Ответ 1

Иногда я делаю что-то подобное, когда у меня есть данные в файле с разделителями табуляции:

df <- read.table(pipe("cut -f1,5,28 myFile.txt"))

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

[Неверная чистая версия R удалена] - см. Только чтение ограниченного количества столбцов для правильной чистой версии R, используя NULL в аргументе colClasses до read.table.

Ответ 2

Одной из возможностей является использование pipe() вместо имени файла и awk или аналогичные фильтры извлекать только нужные столбцы.

Подробнее см. help(connection) для pipe и друзей.

Изменить: read.table() также может сделать это для вас, если вы очень явно о colClasses - значение NULL для данного столбца пропускает столбец alltogether. См. help(read.table). Итак, у нас есть решение в базе R без дополнительных пакетов или инструментов.

Ответ 3

Я думаю, что подход Дирка является прямым и быстрым. Альтернативой, которую я использовал, является загрузка данных в sqlite, который загружает MUCH быстрее, чем read.table(), а затем вытаскивает только то, что вы хотите. пакет sqldf() делает все это довольно просто. Здесь ссылка на предыдущий ответ, который дает примеры кода для sqldf().

Ответ 5

Это, вероятно, больше, чем вам нужно, но если вы работаете на очень больших наборах данных, вы также можете посмотреть пакет HadoopStreaming, который обеспечивает рутификацию с помощью Hadoop.