2013-02-11 6 views
4

Я пытаюсь использовать mapply, чтобы добавить месяцы к текущим датам в столбцах a и b моего фреймворка. Вот код, чтобы создать фрейм данных выборки:Оператор «% m%» с mapply

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, не инициализировать = TRUE): нет слота названия «группа» для данного объекта класса «derivedDefaultMethod»

Можно ли использовать mapply с оператором% m +%?

+0

Какой пакет является оператором '% м +%' и функция 'months' в? Я не думаю, что это в «базе». Это 'lubridate'? –

+0

6 разных пакетов (ни один из них не lubridate) отображаются с 'library (sos); findFn "% т +%") '. –

+0

Да, '% m +%' - это пакет 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 иначе вы получите числовую матрицу, как класс даты разделяется при упрощении до матрицы.

Или Map(lubridate:::.quick_month_add,df,months(1:2))

+2

Немного об игре с пользовательской функцией «Map2», https://gist.github.com/hadley/4758366, предполагает, что это связано с тем, что мы не реализовали '[[' метод для периодов. – hadley

+2

FYI Я предпочитаю использовать 'Map' для' mapply', потому что по умолчанию используется 'simplify = FALSE' – hadley

+0

Я думаю, что это должно быть' Map (lubridate :::. Quick_month_add, df, 1: 2) ', а не' Map (lubridate . ::: quick_month_add, ДФ, месяцев (1: 2)) ' –