【问题标题】:disabling mapply automatically converting Dates to numeric禁用 mapply 自动将日期转换为数字
【发布时间】:2014-12-17 22:34:46
【问题描述】:

我注意到当你这样做时:

mapply(function(x) { x }, c(as.Date('2014-1-1'), as.Date('2014-2-2')))

R 会自动将您的日期向量转换为数字向量。有没有办法禁用这种行为?

我知道您可以将结果包装在 as.Date(..., origin='1970-1-1') 中,但我只能想象这里必须有更好的解决方案。

【问题讨论】:

  • 旁注:你也许应该重写你的代码示例,这不是使用mapply的正确方法。
  • 我不确定你的意思。
  • 我的意思是通常使用mapply 的方式是mapply(function(x,y),X,Y),例如mapply(rep, 1:4, 4:1)。您将其用作sapply/lapply。正如我已经提到的,这只是一个旁注。

标签: r


【解决方案1】:

这与mapply 通过simplify2array 简化其结果的方式有关。

x <- list(as.Date('2014-1-1'), as.Date('2014-2-2'))
simplify2array(x, higher = FALSE)
# [1] 16071 16103

您可以关闭简化,然后手动减少列表。

do.call(c, mapply(I, x, SIMPLIFY = FALSE))
# [1] "2014-01-01" "2014-02-02"

或者您可以使用MapReduce(或do.call

Reduce(c, Map(I, x))
# [1] "2014-01-01" "2014-02-02"

Map 基本上是mapply(..., SIMPLIFY = FALSE),我使用I 代替function(x) { x },因为它只是按原样返回其输入。

【讨论】:

  • 使用I 代替( 对我来说更有意义。
  • 哦,是的,这也有效。没有考虑到这一点。进行了编辑
  • 我喜欢 Reduce(c, Map(I, x)) 方法,这是所有讨论中最好的。谢谢!
  • @chucktaylor 仅供参考,Reduce 通常比 do.call 慢。
猜你喜欢
  • 2018-01-04
  • 1970-01-01
  • 1970-01-01
  • 2023-03-31
  • 2020-11-23
  • 2013-04-15
相关资源
最近更新 更多