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

Tho*_*wne 70 r

当我取消列出日期列表时,它会将它们变回数字.这是正常的吗?除了重新申请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
Run Code Online (Sandbox Code Playgroud)

这是一个错误吗?

Rom*_*rik 80

do.call使用列表"做某事"是一个方便的功能.在我们的例子中,使用连接它c.从列表到单个大数据框架cbind或者rbinddata.frames 并不罕见.

我们在这里做的实际上是连接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"
Run Code Online (Sandbox Code Playgroud)

  • 如果您可以添加更多详细信息来解释您正在做什么,那么这个答案将会得到极大改善,因此其他人会发现以后更具可读性. (7认同)
  • 感谢您的代码。没有回答这个问题:为什么取消列出日期? (5认同)
  • @AlessandroJacopson引用是没有必要的(虽然看到`do.call`的帮助文件),但有时可以方便用于需要引用的函数,例如`do.call("+",as.list(c(1, 1)))`. (2认同)
  • @OriolPrat,调用 `Reduce` n-1 次,其中 n 是列表的长度。对于较大的向量,这将表现得非常糟糕,类似于(实际上,相同)为什么迭代构建列表/向量的性能很差。 (2认同)

Sal*_*m B 8

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

list(as.Date(c("2013-01-01", "2013-02-01", "2013-03-01"))) %>% purrr::reduce(c)
Run Code Online (Sandbox Code Playgroud)

结果是

[1] "2013-01-01" "2013-02-01" "2013-03-01"
Run Code Online (Sandbox Code Playgroud)