为何as.list()无法处理POSIXlt类原子向量?如何转为列表?
为什么
as.list()无法按预期处理POSIXlt类向量? 你观察到的这个现象确实是R的有意设计,背后和POSIXlt类型的底层结构密切相关,咱们一步步来拆解:
首先看你给出的示例:
创建一个POSIXlt时间向量:
x <- as.POSIXlt(Sys.time() - 0:2)
调用as.list(x)后,返回的并不是每个元素为单个POSIXlt对象的列表,而是直接输出了字符形式的时间序列:
as.list(x) # [1] "2018-05-19 12:06:38 PDT" "2018-05-19 12:06:37 PDT" # [3] "2018-05-19 12:06:36 PDT"
核心原因:POSIXlt不是普通原子向量
POSIXlt类型从本质上来说,并不是标准的原子向量(比如整数、字符向量这类),它本身就是一个带有类属性的列表——内部包含了sec(秒)、min(分)、hour(时)、mday(日)等11个组件,每个组件都是一个整数向量,用来存储时间的不同部分。
R通过特殊的类方法,让POSIXlt对象可以像普通向量一样被索引、显示和操作,但它的底层依然是列表结构。当你调用as.list()时,R并没有把它当作“需要拆分元素的向量”来处理,而是遵循了其底层列表的特性,最终输出的是转换为字符形式的时间序列(这是因为打印时R自动对POSIXlt对象做了字符转换)。
这种设计是有意为之的:POSIXlt的核心定位是存储时间的细粒度组件,as.list()的行为是为了呼应它的底层结构,而非将其当作普通向量来拆分元素。
可用的替代方案
正如你已经发现的,split()方法可以实现将POSIXlt向量拆分为单个元素列表的需求,配合unname()去掉自动生成的名称,效果很理想:
unname(split(x, x)) # [[1]] # [1] "2018-05-19 12:06:36 PDT" # # [[2]] # [1] "2018-05-19 12:06:37 PDT" # # [[3]] # [1] "2018-05-19 12:06:38 PDT"
另外,你也可以用lapply来实现相同的效果,代码更直观:
lapply(seq_along(x), function(i) x[i])
内容的提问来源于stack exchange,提问作者Rich Scriven
相关产品推荐
相关产品推荐

