"%m %"运算符与mapply函数的配合使用

4
我将使用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))时,出现错误信息:

Error in .setupMethodsTables(fdef, initialize = TRUE) : no slot of name "group" for this object of class "derivedDefaultMethod"

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


иҝҗз®—з¬Ұ%m+%е’ҢеҮҪж•°months()еұһдәҺе“ӘдёӘеҢ…пјҹжҲ‘и®ӨдёәдёҚжҳҜbaseеҢ…гҖӮе®ғжҳҜlubridateеҢ…еҗ—пјҹ - Blue Magister
使用 library(sos); findFn("%m+%") 命令可以找到 6 个不同的包(其中没有 lubridate) 。 - IRTFM
是的,%m+% 是来自于 lubridate 包。 - Lukas Halim
我可以验证,尽管sos没有找到它,%m+%确实是lubridate包的一部分。我从来没有掌握过S4方法的设置过程,但问题似乎就在这里。 - mnel
1个回答

1
对于我这样一个不懂S4的人来说,这似乎是lubridate包和%m+%方法构造方式的问题。
查看源代码,
似乎未导出的函数.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))

2
通过自定义 Map2 函数 https://gist.github.com/hadley/4758366 的一些尝试,我们发现这是因为我们没有为句点实现 [[ 方法。 - hadley
2
我更喜欢使用Map而不是mapply,因为它默认为simplify = FALSE - hadley
我认为应该是 Map(lubridate:::.quick_month_add,df,1:2) 而不是 Map(lubridate:::.quick_month_add,df,months(1:2)) - Lukas Halim

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接