【问题标题】:Why does unlist() kill dates in R?为什么 unlist() 会杀死 R 中的日期?
【发布时间】:2013-03-27 13:15:51
【问题描述】:

当我取消列出日期列表时,它会将它们重新转换为数字。这正常吗?除了重新申请 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

这是一个错误吗?

【问题讨论】:

  • 来自?unlist: 在可能的情况下,列表元素在取消列出期间被强制转换为普通模式,因此结果通常以字符向量结尾。向量将被强制转换为层次结构中组件的最高类型 NULL
  • 是的,我确实阅读了手册......它们已经处于通用模式
  • 我同意这种行为不正常。但始终建议阅读您正在使用的函数的文档。
  • @Arun 我不明白这有什么关系。日期向量在内部是整数,所以问题实际上是属性被剥离了。文档没有明确提及这一点,但 unlist 无法保留一般属性。
  • @Arun 是的,因为unlist 返回非列表输入不变。对我来说似乎一点也不模糊,但文档应该提到属性会发生什么。

标签: r


【解决方案1】:

do.call 是一个方便的函数,可以用列表“做某事”。在我们的例子中,使用c 连接它。 cbindrbind data.frames 从列表到单个大 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"

【讨论】:

  • 如果您可以添加更多详细信息来解释您在做什么,这个答案将会大大改善,这样其他人以后会发现它更具可读性。
  • @AlessandroJacopson 引用不是必需的(尽管请参阅do.call 的帮助文件),但有时对于需要引用的函数很方便,例如do.call("+", as.list(c(1, 1))).
  • 另一个不错的方法是使用Reduce执行从列表到向量的转换,即Reduce("c",dd)
  • @OriolPrat,调用Reduce n-1 次,其中 n 是列表的长度。这将在更大的向量上表现得非常糟糕,类似于(实际上,相同)为什么迭代地构建列表/向量是一个糟糕的表现。
  • 感谢您的代码。不回答问题,但:为什么取消列出杀死日期?
【解决方案2】:

或使用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"

【讨论】:

  • 这太棒了!
猜你喜欢
  • 2017-01-05
  • 1970-01-01
  • 1970-01-01
  • 2014-11-26
  • 2014-01-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多