Как работать с одним столбцом из двух форматов и одного класса?

#r

#r

Вопрос:

У меня есть один столбец с двумя разными форматами, но с тем же классом ‘factor’.

 D$date
2009-05-12 11:30:00
2009-05-13 11:30:00
2009-05-14 11:30:00
2009-05-15 11:30:00
42115.652
2876
8765

class(D$date)
factor
  

Что мне нужно, так это преобразовать число в дату.

 D$date <- as.character(D$date)
D$date=ifelse(!is.na(as.numeric(D$date)), 
             as.POSIXct(as.numeric(D$date) * (60*60*24), origin="1899-12-30", tz="UTC"), 
             D$date)
  

Теперь число было преобразовано, но в странное число "1429630800" .

Я пробовал без ifelse:

 as.POSIXct(as.numeric(42115.652) * (60*60*24), origin="1899-12-30", tz="UTC")
[1] "2015-04-21 15:38:52 UTC"
  

Он был преобразован красиво.

Ответ №1:

Проблема в том, что вы смешиваете классы в истинных / ложных половинах вашего ifelse. Вы можете исправить это, добавив as.character вот так

 D$date = ifelse(!is.na(as.numeric(D$date)), 
           as.character(as.POSIXct(as.numeric(D$date) * (60*60*24), origin="1899-12-30", tz="UTC")), 
           D$date)

#D
#                 date
#1 2009-05-12 11:30:00
#2 2009-05-13 11:30:00
#3 2009-05-14 11:30:00
#4 2009-05-15 11:30:00
#5 2015-04-21 15:38:52
#6 1907-11-15 00:00:00
#7 1923-12-30 00:00:00
  

Ответ №2:

Вы также можете создать функцию, которая преобразует каждое значение в POSIX , затем используя lapply и do.call .

 b <- c("2009-05-12 11:30:00", "2009-05-13 11:30:00", "2009-05-14 11:30:00", 
       "2009-05-15 11:30:00", "42115.652", "2876", "8765")
foo <- function(x){
  if(!is.na(as.numeric(x))){
    as.POSIXct(as.numeric(x) * (60*60*24), origin="1899-12-30", tz="UTC") 
  }else{
    as.POSIXct(x, origin="1899-12-30", tz="UTC")
  }
}
do.call("c", lapply(b, foo))
[1] "2009-05-12 13:30:00 CEST" "2009-05-13 13:30:00 CEST" "2009-05-14 13:30:00 CEST" "2009-05-15 13:30:00 CEST"
[5] "2015-04-21 17:38:52 CEST" "1907-11-15 01:00:00 CET"  "1923-12-30 01:00:00 CET"