为什么 mapply(as.POSIXct , myCSV) 中的 class 类型不被识别为 POSIX 类型?

Why is the class type in mapply(as.POSIXct , myCSV) not recognised as POSIX type?

我有一个 character/string 格式的日期列表,我需要将它们读取为 POSIXct 日期。

>  x  <- as.POSIXct("95-11-22" , format="%y-%m-%d")             #should equal myParsedDates[1]
> typeof(x)
[1] "double"
> class(x)
[1] "POSIXct" "POSIXt"                                      #Member of POSIXct class

> myDates <- c("95-11-22", "95-11-23", "95-12-25")
> myParsedDates <- mapply(function(x){as.POSIXct(x, format="%y-%m-%d")}   ,   myDates)
> typeof(myParsedDates[1])
[1] "double"
> class(myParsedDates[1])
[1] "numeric"                                               #Not a member of POSIXct 

> x                              #The class information is retained
[1] "1995-11-22 AWST"
> myParsedDates[1]               #The class information is lost
 95-11-22 
816969600 

为什么在列表中调用mapply时,POSIXct class信息会丢失?怎么才能留得住?

这本质上是 S3 class 属性在连接向量时丢失的(已知的,有记录的,仍然令人难过)错误特征的更复杂版本。

我这里用的是as.Date()(而且是无格式解析的字符串),但是和as.POSIXct()一样。

首先,什么有效:

> as.Date("2022-01-16")
[1] "2022-01-16"
> as.Date("2022-01-16")
[1] "2022-01-16"
> 

其次,什么没有_因为sapply构造了一个向量:

> sapply(c("2022-01-16", "2022-01-17"), as.Date)
2022-01-16 2022-01-17 
     19008      19009 
> class(sapply(c("2022-01-16", "2022-01-17"), as.Date))
[1] "numeric"
> 

实际的 names 回来了,因为 sapply 很乐意将它们用作标签,但结果不再是 Date 对象。为了完整起见,与 as.POSIXct:

相同
> as.POSIXct("2022-01-16")
[1] "2022-01-16 CST"
> class(as.POSIXct("2022-01-16"))
[1] "POSIXct" "POSIXt" 
> class(sapply(c("2022-01-16", "2022-01-17"), as.POSIXct))
[1] "numeric"
> 

它通过 lapplydo.call() 工作:

> do.call(c, lapply(c("2022-01-16", "2022-01-17"), as.Date))
[1] "2022-01-16" "2022-01-17"
> class(do.call(c, lapply(c("2022-01-16", "2022-01-17"), as.Date)))
[1] "Date"
> 

如果将对象作为 data.frame 的一部分并堆叠 data.frame 行,and/or 如果将它们注入预分配的向量,或者...如果一个人简单地调用向量化:

> as.Date(c("2022-01-16", "2022-01-17"))
[1] "2022-01-16" "2022-01-17"
> class(as.Date(c("2022-01-16", "2022-01-17")))
[1] "Date"
> 

当然这并不总是可能的。