为什么 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"
>
它通过 lapply
和 do.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"
>
当然这并不总是可能的。
我有一个 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"
>
它通过 lapply
和 do.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"
>
当然这并不总是可能的。