Как изменить несколько форматов даты в одном столбце

До сих пор я столкнулся с колонкой dataframe с датами в разных символьных форматах. Некоторые из них отображаются в размере %d.%m.%Y , некоторые в %m/%d/%Y :

 data$initialDiagnose = as.character(data$initialDiagnose) data$initialDiagnose[1:10] [1] "14.01.2009" "9/22/2005" "4/21/2010" "28.01.2010" "09.01.2009" "3/28/2005" "04.01.2005" "04.01.2005" "9/17/2010" "03.01.2010" 

Я хочу, чтобы они были как Date () в одном формате, но R отказывается, конечно.
Поэтому я сначала попытался изменить их разделителем:

 data$initialDiagnose[grep('/', data$initialDiagnose)] = as.character.Date(data$initialDiagnose[grep('/', data$initialDiagnose)], format = '%m/%d/%Y') 

Аналог «.» даты. Но это не сработало.

Как я могу изменить их все в один формат, чтобы я мог работать с ними?

 a <- as.Date(data$initialDiagnose,format="%m/%d/%Y") # Produces NA when format is not "%m/%d/%Y" b <- as.Date(data$initialDiagnose,format="%d.%m.%Y") # Produces NA when format is not "%d.%m.%Y" a[is.na(a)] <- b[!is.na(b)] # Combine both while keeping their ranks data$initialDiagnose <- a # Put it back in your dataframe data$initialDiagnose [1] "2009-01-14" "2005-09-22" "2010-04-21" "2010-01-28" "2009-01-09" "2005-03-28" "2005-01-04" "2005-01-04" "2010-09-17" "2010-01-03" 

Дополнение - это предыдущий метод, адаптированный к ситуации, когда у вас есть три (или более) разных формата:

 data$initialDiagnose [1] 14.01.2009 9/22/2005 12 Mar 97 4/21/2010 28.01.2010 09.01.2009 3/28/2005 Levels: 09.01.2009 12 Mar 97 14.01.2009 28.01.2010 3/28/2005 4/21/2010 9/22/2005 multidate <- function(data, formats){ a<-list() for(i in 1:length(formats)){ a[[i]]<- as.Date(data,format=formats[i]) a[[1]][!is.na(a[[i]])]<-a[[i]][!is.na(a[[i]])] } a[[1]] } data$initialDiagnose <- multidate(data$initialDiagnose, c("%m/%d/%Y","%d.%m.%Y","%d %b %y")) data$initialDiagnose [1] "2009-01-14" "2005-09-22" "1997-03-12" "2010-04-21" "2010-01-28" "2009-01-09" "2005-03-28" 

Мне нравится lubridate для простоты использования:

 library(lubridate) # note added ugly formats below data <- data.frame(initialDiagnose = c("14.01.2009", "9/22/2005", "4/21/2010", "28.01.2010", "09.01.2009", "3/28/2005", "04.01.2005", "04.01.2005", "Created on 9/17/2010", "03 01 2010")) mdy <- mdy(data$initialDiagnose) dmy <- dmy(data$initialDiagnose) mdy[is.na(mdy)] <- dmy[is.na(mdy)] # some dates are ambiguous, here we give data$initialDiagnose <- mdy # mdy precedence over dmy data # initialDiagnose # 2009-01-14 # 2005-09-22 # 2010-04-21 # 2010-01-28 # 2009-09-01 # 2005-03-28 # 2005-04-01 # 2005-04-01 # 2010-09-17 # 2010-03-01 
  • Установить формат даты по умолчанию c #
  • Формат метода (String, Object ) в типе String не применим для аргументов (...)
  • Нужно форматировать даты в динамически построенных WPF DataGrid
  • Как преобразовать миллисекунды в читаемую человеком форму?
  • Форматирование двух-двух знаков после запятой
  • Как отформатировать дату в angularjs
  • Независимо от платформы size_t Спецификаторы формата в c?
  • Как отформатировать DateTime до 24 часов?
  • Как отредактировать частичный формат в Rails?
  • Java: исключение исключаемых дат
  • Как форматировать вывод печати или строку в фиксированную ширину?
  • Давайте будем гением компьютера.