2016-10-04 12 views
2

我有一列有兩種不同的格式,但同一個班級的「因素」。如何處理兩種格式和單個類的一列?

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" 

這是很好的轉變。

回答

3

問題是,你正在混合你的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 
1

還可以創建,其將在每個POSIX值,然後使用lapplydo.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" 
相關問題