read_csv (readr, R) заполняет весь столбец символом NA, если в первом наборе 1000 + x наблюдений есть NA в простом и чистом csv (ошибка синтаксического анализа) - PullRequest
1 голос
/ 28 мая 2019

Я только что пережил огромную головную боль, вызванную тем, что read_csv испортил мои данные, заменив содержимое на NA при чтении простых и чистых CSV-файлов.

Я перебираю несколько больших CSV-файлов, которые составляют миллионы наблюдений. Некоторые столбцы содержат довольно много NA для некоторых переменных.

При чтении CSV, который содержит NA в определенном столбце для первых 1000 + x наблюдений, read_csv заполняет весь столбец NA и, таким образом, данные теряются для дальнейших операций.

Отображается предупреждающее сообщение «Предупреждение: ошибка синтаксического анализа», но, поскольку я читаю несколько файлов, я не могу проверить этот файл за файлом. Тем не менее, я не знал бы автоматического исправления проблемы синтаксического анализа, указанной также для проблем (x)

Использование read.csv вместо read_csv не вызывает проблемы, но это медленно, и я сталкиваюсь с проблемами кодирования (использование разных кодировок требует слишком много памяти для больших файлов).

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

См. Упрощенный пример ниже:

##create a dtafrane
    df <- data.frame( id = numeric(), string = character(), 
                  stringsAsFactors=FALSE)
##poluate columns
    df[1:1500,1] <- seq(1:1500)
    df[1500,2] <- "something" 
# variable string contains the first value in obs. 1500 
    df[1500,]
## check the numbers of NA in variable string
    sum(is.na(df$string))   # 1499
##write the df
    write_csv(df, "df.csv")
##read the df with read_csv and read.csv
    df_readr <- read_csv('df.csv')
    df_read_standard <- read.csv('df.csv')
##check the number of NA in variable string
    sum(is.na(df_readr$string))  #1500
    sum(is.na(df_read_standard$string))  #1499
## the read_csv files is all NA for variable string
    problems(df_readr) ##What should that tell me? How to fix it?

1 Ответ

0 голосов
/ 02 июля 2019

Спасибо MrFlick за ответ на мои вопросы:

Причина, по которой read_csv может быть быстрее, чем read.csv, заключается в том, что он может делать предположения о ваших данных. Он просматривает первые 1000 строк, чтобы угадать типы столбцов (через guess_max), но если в столбце нет данных, он не может угадать, что находится в этом столбце. Поскольку вы, кажется, знаете, что должно быть в столбцах, вы должны использовать параметр col_types=, чтобы сообщить read_csv, чего ожидать, а не делать предположения. См. Справочную страницу ?readr::cols, чтобы узнать, как read_csv узнать, что нужно знать.

Также guess_max = Inf решает проблему, но преимущество read_csv в скорости, похоже, потеряно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...