为什么在将列表转换为向量时将POSIXct转换为数字

jka*_*brg 3 r posixct

我有一个列表redDressTweetsstatusES.status是一个有字段的类created.我正在尝试列出发布推文的时间列表.这是我试图这样做的方式

times <- unlist(lapply(redDressTweets, function(tweet) {tweet$created }))
Run Code Online (Sandbox Code Playgroud)

输出是数字向量:

[1] 1478044029 1477954062 1477909847 1477887746 1477832560 1477640940 1477640939
[8] 1477628031 1477540826
Run Code Online (Sandbox Code Playgroud)

但是这个类redDressTweets[[1]]$created"POSIXct" "POSIXt".

为什么会发生这种情况?如何阻止它将POSIXct转换为数字?

Rol*_*and 8

您可以像这样轻松地重现:

x <- list(as.POSIXct("2016-11-02"), as.POSIXct("2016-11-03"))
unlist(x)
#[1] 1478041200 1478127600
Run Code Online (Sandbox Code Playgroud)

unlist结合列表中的值.POSIXct变量的内部表示是数值.POSIXct由于属性,它们只是一个变量,最重要的是class属性.列表可以包含所有类型的对象.文件说:

在可能的情况下,列表元素在未列出期间被强制为共同模式,因此结果通常最终作为字符向量.向量将被强制转换为层次结构中最高类型的组件NULL <raw <logical <integer <double <complex <character <list <expression:pairlists被视为列表.

请注意,它表示"共模",而不是普通类.由于类可以是任何东西并且可以强制执行任何类型的底层结构(例如,甚至可能无法以有意义的方式组合同一类的两个对象),unlist只需去除所有属性(除了list所有元素都是因素的地方) ).可以处理POSIXct像值这样的factor值,但情况并非如此(并且可能具有性能影响).

您无法避免这种情况,但可以轻松修复:

y <- unlist(x)
attributes(y) <- attributes(x[[1]])
y
#[1] "2016-11-02 CET" "2016-11-03 CET"
Run Code Online (Sandbox Code Playgroud)

显然,这假设所有列表元素具有相同的时区属性.