如何处理两种格式和单一类的一列?

时间:2016-10-04 08:55:09

标签: r

我有一个列有两种不同的格式但是同一类'因子'。

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"

很好地转换了。

2 个答案:

答案 0 :(得分: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 :(得分: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"