当将列表转换为向量时,为什么POSIXct会被转换为数字

7

我有一个名为redDressTweets的列表,其中包含statusstatus是一个带有created字段的类。 我正在尝试形成一份推文发布时间列表。 这是我的做法:

times <- unlist(lapply(redDressTweets, function(tweet) {tweet$created }))

输出结果是一组数字向量:
[1] 1478044029 1477954062 1477909847 1477887746 1477832560 1477640940 1477640939
[8] 1477628031 1477540826

但是redDressTweets[[1]]$created的类别是"POSIXct" "POSIXt"

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

1个回答

12

你可以像这样更容易地复制:

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

unlist将列表中的值组合在一起。 POSIXct变量的内部表示是数值类型。它们之所以是POSIXct变量,是因为有属性存在,最重要的是class属性。列表可以容纳各种对象。文档说明:

在可能的情况下,在取消列表元素时,它们被强制转换为公共模式,因此结果通常最终成为字符向量。向量将被强制转换为层次结构中组件的最高类型NULL < raw < logical < integer < double < complex < character < list < expression:pairlists被视为列表。

请注意,它说的是“公共模式”,而不是公共类。由于类可以是任何东西并可以强制实施任何类型的基本结构(例如,甚至可能无法以有意义的方式组合两个相同类别的对象),unlist只会剥离所有属性(除了所有元素都是要素的list)。可以像对待factor值那样处理POSIXct值,但这不是情况(可能会影响性能)。

您无法避免此问题,但可以轻松地解决:

y <- unlist(x)
attributes(y) <- attributes(x[[1]])
y
#[1] "2016-11-02 CET" "2016-11-03 CET"

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


除非它是一个命名列表,否则只返回翻译后的文本。在这种情况下,您必须添加poix属性,而不仅仅是设置它: attributes(y) <- c(attributes(y), attributes(x[[1]])) - undefined

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接