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

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

2 ответа

Решение

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

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

В основном дополнение к ответу @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 порождает ускорение.

Другие вопросы по тегам