为什么unlist()杀死R中的日期


83

当我取消列出日期列表时,会将它们重新转换为数字。那是正常的吗?除了重新申请as.Date以外,还有其他解决方法吗?

> dd <- as.Date(c("2013-01-01", "2013-02-01", "2013-03-01"))
> class(dd)
[1] "Date"
> unlist(dd)
[1] "2013-01-01" "2013-02-01" "2013-03-01"
> list(dd)
[[1]]
[1] "2013-01-01" "2013-02-01" "2013-03-01"

> unlist(list(dd))
[1] 15706 15737 15765

这是一个错误吗?


2
From ?unlist在取消列出过程中,列表元素可能会被强制转换为通用模式,因此结果通常以字符向量结尾。向量将被强制转换为层次结构中组件的最高类型。NULL <原始<逻辑<整数<实<复杂<字符<列表<表达式:对列表被视为列表。
阿伦(Arun)2013年

6
是的,我确实读过手册。...它们已经处于通用模式
Thomas Browne

1
我同意这种行为是不正常的。但是,始终建议您阅读所使用函数的文档。
阿伦(Arun)2013年

7
@Arun我不明白为什么这么重要。日期向量在内部是整数,因此问题实际上是剥离了属性。文档中没有明确提及这一点,但是unlist不可能总体上保留属性。
哈德利2013年

1
@Arun是,因为unlist返回的非列表输入保持不变。在我看来,这似乎一点也不模糊,但是文档应该提到属性发生了什么。
哈德利2013年

Answers:


93

do.call是使用列表“执行某些操作”的便捷功能。在我们的情况下,使用将它串联起来c。列表中的data.framecbindrbind单个大data.frame并不罕见。

我们在这里所做的实际上是连接dd列表中的元素。这类似于c(dd[[1]], dd[[2]])。请注意,c可以将其作为功能或字符提供。

> dd <- list(dd, dd)
> (d <- do.call("c", dd))
[1] "2013-01-01" "2013-02-01" "2013-03-01" "2013-01-01" "2013-02-01" "2013-03-01"
> class(d) # proof that class is still Date
[1] "Date"

7
如果您可以添加一些更多的细节来解释您的工作,那么此答案将得到极大的改善,以便其他人以后会更容易理解。
Dinre 2013年

为什么"在附近c
亚历山德罗·贾科普森

3
@AlessandroJacopson的引号不是必需的(尽管请参阅的帮助文件do.call),但有时对于需要被引号的函数来说可能很方便do.call("+", as.list(c(1, 1)))
RomanLuštrik17年

1
另一个不错的方法是使用进行从列表到矢量的转换Reduce,即 Reduce("c",dd)
Oriol Prat

2
感谢您的代码。没有回答这个问题,例如:为什么不列出杀死日期?
dfrankow

0

或使用purrr将日期列表展平为矢量保留类型:

list(as.Date(c("2013-01-01", "2013-02-01", "2013-03-01"))) %>% purrr::reduce(c)

结果是

[1] "2013-01-01" "2013-02-01" "2013-03-01"
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.