получение ошибки для значений «NA» при чтении файла с помощью read_csv() с помощью tiddyverse

#r #tidyverse #na #data-wrangling #readr

Вопрос:

Я пытаюсь прочитать файл, в котором столбец обычно содержит двойник, но когда значение нейтральное, в качестве значения используется «Спокойствие». Поэтому, когда я читаю файл, который я использую na = "Calm | calm" , и внутри col_types = cols() я анализирую столбец, используя '9am wind speed (km/h)' = col_double() приведенную ниже функцию для создания тибблов.

 generate_tibble <- function(filename) {
    temp_tibble <- read_csv(
            paste0("./data/", filename),
            na = c('calm',"Calm"),
            skip = 7,
            col_types = cols(
               'Date' = col_date(format = "%d/%m/%Y"),
               'Evaporation (mm)' = col_double(),
               'Sunshine (hours)' = col_double(),
               '9am wind speed (km/h)' = col_double()
               )
            )
    }
 

после этого я прочитал свой первый файл следующим образом: main_df <- generate_tibble(file_names[1]) с которым я собираюсь объединить другие файлы, используя имена столбцов. Поэтому я запускаю цикл, используя следующий код.

 for (i in file_names[2:length(file_names)]) {
  temp <- generate_tibble(i)
  main_df <- rbind(main_df, temp)
  print(paste("FINISHED PARSING:", i))
}
 

но когда я запускаю цикл, я получаю такие ошибки:

ошибка после цикла

когда я запускаю problems(main_df) его, отобразите это сообщение: сообщение после запуска проблем()

что мне следует сделать, чтобы устранить эту проблему? заранее спасибо.

Комментарии:

1. Основываясь на том, что отображается, problems(main_df) вы можете вручную проверить, что находится (например) в строке 2 столбца 5. Похоже, что это»», которое не является двойным. Вы могли бы добавить это к na = .

2. Обратите внимание, что ваш цикл недостаточно эффективно распределяет память. evodify.com/r-loops-are-slow

Ответ №1:

Вместо того, чтобы пытаться ввести set и обработать внутри read_csv, вы можете попробовать выполнить форматирование после чтения файла. Вот аккуратная версия вашей функции

 generate_tibble <- function(filename) {

 temp_tibble <- read_csv(file.path(".","data","filename")) %>%
                mutate('Date' = col_date(format = "%d/%m/%Y"),
               'Evaporation (mm)' = col_double(),
               'Sunshine (hours)' = col_double(),
               '9am wind speed (km/h)' = col_double())

}
 

Все строковые значения должны быть преобразованы в NA, когда вы заставляете столбец быть числовым. Поэтому вам не нужно указывать «Спокойствие». file.path() Функция предназначена для путей к файлам, чтобы ваш код мог использоваться как пользователями Linux, так и Windows.

После этого я рекомендую использовать lapply() функцию вместо цикла и привязать продукт лапли с помощью data.table::rbindlist()

https://www.datacamp.com/community/tutorials/r-tutorial-apply-family?utm_source=adwords_ppcamp;utm_campaignid=12492439679amp;utm_adgroupid=122563408041amp;utm_device=camp;utm_keyword=apply family ramp;utm_matchtype=bamp;utm_network=gamp;utm_adpostion=amp;utm_creative=504158803141amp;utm_targetid=aud-522010995285:kwd-614516587376amp;utm_loc_interest_ms=amp;utm_loc_physical_ms=9028709amp;gclid=Cj0KCQjw18WKBhCUARIsAFiW7JzR0Avzz054y2tx2b1Sx7hZOEGHMRxfNdmgodVnzh9fqNUyg5JsAz4aAvvyEALw_wcB#codelapplycode