#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()