2015-02-19 1 views
3

обновление (июнь 2016)

col.names был добавлен data.table 1.9.6 так проблема закончена, и все супер счастливы :) Я думаю, что теперь я могу преобразовать все мои read.csv вызовы Fread вызовов без забот разрушенияR data.table Fread не используя именованные colClasses без заголовка (например, не col.names?)

оригинального вопрос

использования data.table 1.9.4

Я импортировать read.csv звонки чтобы пострадать из-за огромных улучшений производительности, которые мы заметили. Большинство проблем, с которыми я могу справиться, но я достиг точки, в которой я не знаю, и если у кого-то есть изящное решение.

Моя проблема заключается в том, что я назвал colClasses, но вход не имеет заголовок (это функция Grep), вот глупый пример, чтобы иметь смысл:

males.students <- read.csv(pipe("grep Male students.csv"), 
          col.names=c("id", "name", "gender"), 
          colClasses=(id="numeric")) 

сейчас в FREAD я все еще хочу названные colClasses но у меня нет имен Col так просто с помощью

males.students <- fread("grep Male students.csv"), 
         colClasses=(id="numeric")) 

терпит неудачу с

имя столбца 'ид' в colClasses [[1]] не F ound

Как это исправить? есть ли планы добавить col.names?

+0

Поскольку вы знаете, что это первый столбец, вы можете просто использовать номер столбца для этого. 'Список colClasses = (числовое = 1))'. – shadow

+0

Попробуйте использовать аргумент 'select', а также –

+0

@shadow это был явно упрощенный пример: у реального csv есть 40 столбцов, и я устанавливаю colClasses для 19 из них, и я действительно не думаю, что разумно использовать столбец числа, вы хотите, чтобы ваша система была надежной и позволяла изменять, не заставляя ваши данные таинственно менять типы, не выясняя почему. –

ответ

2

Добавить имена в командной строке:

fread('echo "id,name,gender"; grep Male students.csv', colClasses = c(id='numeric')) 
+0

Этот хак не будет масштабироваться для больших файлов. – smci

+0

@smci huh, что там масштабировать? нет никаких накладных расходов при добавлении 'echo' поверх существующего' grep' – eddi

+0

'echo + grep' используют командную строку для создания временного файла, который может быть очень большим, и сдувает память. Что, если students.csv имеет 10M строк? – smci

0

Ответ на исходный вопрос, если проблема заключается в том, что grep удаляет заголовок, вы можете использовать awk вместо того, чтобы напечатать первую строку и все строки, содержащие " Мужчина ":

fread("awk 'NR==1 || /Male/' students.csv"), colClasses=(id="numeric")) 

Это может помочь людям, которые до сих пор используют старую версию data.table.

Смежные вопросы