2015-07-14 2 views
4

Я понимаю, что чтение CSV-файла удаляет ведущие нули, но для некоторых из моих файлов он поддерживает ведущие нули без моего явного задания colClasses в read.csv. С другой стороны, что меня смущает, в других случаях оно удаляет ведущие нули. Поэтому мой вопрос: в каких случаях read.csv удаляет ведущие нули?R: чтение в CSV-файле удаляет ведущие нули

ответ

7

The read.csv, read.table, и связанные с ними функции считывают все как строки символов, то в зависимости от аргументов функции (в частности colClasses, но и другие) и опции функция будет пытаться «упростить» столбцы. Если достаточно столбца выглядит числовым, и вы не сказали ему иначе, то он преобразует его в числовой столбец, это приведет к отбрасыванию всех ведущих 0 (и завершение 0 после десятичной). Если в столбце есть что-то не похожее на число, то оно не будет конвертировать в числовое, и либо сохранить его как символ, либо преобразовать в коэффициент, это держит ведущие 0. Функция не всегда смотрит на весь столбец, чтобы принять решение, поэтому то, что может быть очевидно для вас, поскольку оно не является числовым, все равно может быть преобразовано.

Самый безопасный подход (и самый быстрый) заключается в том, чтобы указать colClasses, так что R не нужно угадывать (и вам не нужно гадать, что R собирается угадать).

2

В основном дополнение к ответу @ GregSnow, из руководства.

Все цитаты из ?read.csv:

Если только colClasses указано, все столбцы читаются как столбцы символов, а затем преобразуются с помощью type.convert в логический, целое число, число, комплекс или (в зависимости от as.is) при необходимости. Котировки (по умолчанию) интерпретируются во всех полях, поэтому столбец значений типа «42» приведет к целочисленному столбцу.

также:

Число столбцов данных определяется, глядя на первые пять линий ввода ...

Предлагает read.csv смотрит на первые 5 строк и догадок будь столбец numeric/integer оттуда, в противном случае сохраняет его как character (и таким образом держит ведущий 0).

Если вы все еще интересуетесь более подробной информацией, я предлагаю вам изучить код в edit(read.csv) и edit(read.table), которые являются длинными, но будут описывать каждый шаг функции.

Наконец, как в сторону, это вообще хорошая практика, чтобы указать colClasses:

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

Хотя, если вы действительно обеспокоены использованием/скоростью использования памяти, вы действительно должны использовать fread from data.table; даже тогда, указывая colClasses, создается ускорение.