Объединение> 100 файлов xlsx, проблема с форматом даты POSIX из-за разных столбцов в файлах

#r #lapply

#r #lapply

Вопрос:

Относительно новичок во всем этом и был бы признателен за помощь:

Я пытаюсь объединить> 100 файлов xlsx в R. У них в основном похожие столбцы, поэтому позже я использую rbind.заполните, как только они появятся в списке. Однако у меня возникают трудности с объединением списка в один большой фрейм данных из-за проблемы с форматированием даты. Я застрял на следующей ошибке:

 Error in as.POSIXlt.character(x, tz, ...) : 
  character string is not in a standard unambiguous format
 

Вот мой код на данный момент:

 # Reading the list of files in my folder
file_list <- list.files(path="data/")

# reading the data into a list
library(readxl)

All <- lapply(file_list,function(filename){
    print(paste("Merging",filename,sep = " "))
    read_xlsx(filename)
    })

# Merge to one dataframe
df <- do.call(rbind.fill, All)
 

Вот где я получаю ошибку. Я думаю, это потому, что в некоторых файлах столбцы дат имеют разные форматы.

Вопрос: Есть ли способ lapply функционировать (или что-то в этом роде) так, чтобы все столбцы даты из списка были в одном формате? Я упускаю что-то совершенно очевидное здесь? Я был бы в порядке, если бы был способ преобразовать их в символы, а затем вернуться к дате позже, если это быстрое решение, но я не уверен, как именно это сделать. Спасибо за любую помощь.

Ответ №1:

Если вы знаете все возможные Date имена столбцов, то вы могли бы сделать что-то подобное, прежде rbind чем:

 dtcols <- c("date", "Somedate", "date123")
All <- lapply(All, function(dat) {
  cols <- intersect(dtcols, names(dat))
  dat[cols] <- lapply(dat[cols], as.Date)
  dat
})
 

as.Date является идемпотентным, поэтому его безопасно использовать, если столбец уже относится к классу Date . Если cols значение пустое (столбцы не найдены), это по-прежнему безопасно, ничего не делая.

В зависимости от исходных данных может потребоваться указать origin или format as.Date , например

   dat[cols] <- lapply(dat[cols], as.Date, format = "%m/%d/%Y")
 

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

1. Спасибо! Я использовал именно этот формат, но в итоге столкнулся с другой проблемой. Затем я изменил только ‘как. Дата’ в вашем примере как.numeric. Это позволило им повторно связать, и я преобразовал дату после слияния.

2. Метод тот же, рад, что вы смогли адаптироваться. Да, единообразное получение временных меток и дат из книг xlsx может быть проблематичным.