R: чтение в файле .csv удаляет ведущие нули

Я понимаю, что чтение файла .csv удаляет начальные нули, но для некоторых моих файлов начальные нули сохраняются без необходимости явно устанавливать colClasses в read.csv. С другой стороны, что меня смущает, так это то, что в других случаях он ДЕЙСТВИТЕЛЬНО удаляет начальные нули. Итак, мой вопрос: в каких случаях read.csv удаляет ведущие нули?


person user3755880    schedule 14.07.2015    source источник


Ответы (2)


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

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

person Greg Snow    schedule 14.07.2015

В основном дополнение к ответу @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 от data.table; даже в этом случае указание colClasses приводит к ускорению.

person MichaelChirico    schedule 14.07.2015