为什么将列表转换为向量时POSIXct转换为数字
Why is POSIXct converted to numeric when converting list to vector
我有一个 redDressTweets
的 status
列表。 status
是具有字段 created
的 class。我正在尝试形成发布推文的时间列表。这是我正在尝试的方法
times <- unlist(lapply(redDressTweets, function(tweet) {tweet$created }))
输出是一个数字向量:
[1] 1478044029 1477954062 1477909847 1477887746 1477832560 1477640940 1477640939
[8] 1477628031 1477540826
但是redDressTweets[[1]]$created
的class是"POSIXct" "POSIXt"
。
为什么会发生这种情况,如何阻止它把 POSIXct 转换为数字?
您可以像这样更轻松地重现:
x <- list(as.POSIXct("2016-11-02"), as.POSIXct("2016-11-03"))
unlist(x)
#[1] 1478041200 1478127600
unlist
组合列表中的值。 POSIXct
变量的内部表示是数值。由于属性,它们只是 POSIXct
变量,最重要的是 class
属性。列表可以包含所有类型的对象。文档说:
Where possible the list elements are coerced to a common mode during
the unlisting, and so the result often ends up as a character vector.
Vectors will be coerced to the highest type of the components in the
hierarchy NULL < raw < logical < integer < double < complex <
character < list < expression: pairlists are treated as lists.
请注意,它说的是 "common mode",而不是常见的 class。由于 class 可以是任何东西并且可以强制执行任何类型的底层结构(例如,甚至可能无法以有意义的方式组合相同 class 的两个对象),unlist
只是去除所有属性(除了 list
,其中所有元素都是因子)。可以处理 POSIXct
值,例如 factor
值,但事实并非如此(并且可能会对性能产生影响)。
您无法避免这种情况,但可以轻松修复它:
y <- unlist(x)
attributes(y) <- attributes(x[[1]])
y
#[1] "2016-11-02 CET" "2016-11-03 CET"
显然这假设所有列表元素都具有相同的时区属性。
我有一个 redDressTweets
的 status
列表。 status
是具有字段 created
的 class。我正在尝试形成发布推文的时间列表。这是我正在尝试的方法
times <- unlist(lapply(redDressTweets, function(tweet) {tweet$created }))
输出是一个数字向量:
[1] 1478044029 1477954062 1477909847 1477887746 1477832560 1477640940 1477640939
[8] 1477628031 1477540826
但是redDressTweets[[1]]$created
的class是"POSIXct" "POSIXt"
。
为什么会发生这种情况,如何阻止它把 POSIXct 转换为数字?
您可以像这样更轻松地重现:
x <- list(as.POSIXct("2016-11-02"), as.POSIXct("2016-11-03"))
unlist(x)
#[1] 1478041200 1478127600
unlist
组合列表中的值。 POSIXct
变量的内部表示是数值。由于属性,它们只是 POSIXct
变量,最重要的是 class
属性。列表可以包含所有类型的对象。文档说:
Where possible the list elements are coerced to a common mode during the unlisting, and so the result often ends up as a character vector. Vectors will be coerced to the highest type of the components in the hierarchy NULL < raw < logical < integer < double < complex < character < list < expression: pairlists are treated as lists.
请注意,它说的是 "common mode",而不是常见的 class。由于 class 可以是任何东西并且可以强制执行任何类型的底层结构(例如,甚至可能无法以有意义的方式组合相同 class 的两个对象),unlist
只是去除所有属性(除了 list
,其中所有元素都是因子)。可以处理 POSIXct
值,例如 factor
值,但事实并非如此(并且可能会对性能产生影响)。
您无法避免这种情况,但可以轻松修复它:
y <- unlist(x)
attributes(y) <- attributes(x[[1]])
y
#[1] "2016-11-02 CET" "2016-11-03 CET"
显然这假设所有列表元素都具有相同的时区属性。