【问题标题】:"%m %" operator with mapply带有 mapply 的 "%m %" 运算符
【发布时间】:2013-02-11 19:24:35
【问题描述】:

我正在尝试使用 mapply 将月份添加到我的数据框的 a 和 b 列中的当前日期。以下是创建示例数据框的代码:

library(lubridate)
a <- as.Date(c("2012-01-11","2012-06-30","2012-04-18"))
b <- as.Date(c("2013-04-21","2012-03-22","2012-05-01"))
df <- data.frame(a,b)

我可以使用mapply("+",df, c(30,30)) 为两列日期添加 30 天。但是,当我尝试使用命令 mapply("%m+%",df, months(1:2)) 时,我收到错误消息:

.setupMethodsTables 中的错误(fdef,initialize = TRUE):没有插槽 类“derivedDefaultMethod”的这个对象的名称“组”

是否可以将 mapply 与 %m+% 运算符一起使用?

【问题讨论】:

  • 算子%m+%和函数months在什么包里?我不认为它在base 中。是lubridate吗?
  • 6 个不同的包(没有一个是润滑的)以library(sos); findFn"%m+%") 显示。
  • 是的,%m+% 来自 lubridate 包。
  • 我可以验证,尽管sos 没有找到它,但%m+% 确实是lubridate package 的一部分。我从来没有掌握过 S4 方法的方法设置过程,但问题似乎就在这里。

标签: r lubridate


【解决方案1】:

在我 S4 无知的眼中,这似乎是 lubridate 包和 %m+% 方法的构造方式的问题。

看着the source

看来未导出的函数.quick_month_add 会做你想做的事

 mapply(lubridate:::.quick_month_add,df,months(1:2), SIMPLIFY = FALSE)
$a
[1] "2012-01-11" "2012-06-30" "2012-04-18"

$b
[1] "2013-04-21" "2012-03-22" "2012-05-01"

注意SIMPLIFY 必须设置为FALSE 否则您将得到数字矩阵,因为在简化为矩阵时会剥离 Date 类。

或者,Map(lubridate:::.quick_month_add,df,months(1:2))

【讨论】:

  • 有点玩弄自定义Map2 函数gist.github.com/hadley/4758366,这表明这是因为我们没有为句点实现[[ 方法。
  • 仅供参考,我更喜欢使用Map 而不是mapply,因为它默认为simplify = FALSE
  • 我认为应该是Map(lubridate:::.quick_month_add,df,1:2)而不是Map(lubridate:::.quick_month_add,df,months(1:2))
猜你喜欢
  • 1970-01-01
  • 2022-09-30
  • 1970-01-01
  • 2013-07-15
  • 2020-03-07
  • 2010-12-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多