2017-01-24 2 views
2

Я хотел бы извлечь некоторые праздники, используя library(timeDate). Я использовал следующий синтаксис первого:Loop over holidays in time Дата пакета

EasterSunday<- as.Date(EasterSunday(2015:2018)) 

EasterSunday 
# [1] "2015-04-05" "2016-03-27" "2017-04-16" "2018-04-01" 

Затем я хотел бы добавить соответствующий праздник этой даты последовательности:

EasterSunday<- cbind.data.frame(hd=rep('EasterSunday',length(as.Date(EasterSunday(2015:2018)))),date=as.Date(EasterSunday(2015:2018))) 

EasterSunday 

     #hd   #date 

#1 EasterSunday  2015-04-05 
#2 EasterSunday  2016-03-27 
#3 EasterSunday  2017-04-16 
#4 EasterSunday  2018-04-01 

Тогда я хотел перебрать все праздники в этом пакете:

holidays=c("GoodFriday","EasterSunday","EasterMonday") 

# Here I could not find the appropriate function 
do.call(cbind, lapply(holidays, function(x) EasterSunday((2015:2018)))) 

#[,1] [,2] [,3] 
#[1,] ? ? ? 
+0

Соответствующее, возможное дублирующее сообщение: http://stackoverflow.com/questions/6403852/how-to-call-a-function-using-the-character-string-of-the-function-name-in-r – zx8754

ответ

4

Использование match.fun:

library(timeDate) 

holidays <- c("GoodFriday", "EasterSunday", "EasterMonday") 

do.call(rbind, 
     lapply(holidays, function(i){ 
      foo <- match.fun(i) 
      data.frame(Holiday = i, 
        Dates = as.Date(foo(2015:2018))) 

     })) 
#   Holiday  Dates 
# 1 GoodFriday 2015-04-03 
# 2 GoodFriday 2016-03-25 
# 3 GoodFriday 2017-04-14 
# 4 GoodFriday 2018-03-30 
# 5 EasterSunday 2015-04-05 
# 6 EasterSunday 2016-03-27 
# 7 EasterSunday 2017-04-16 
# 8 EasterSunday 2018-04-01 
# 9 EasterMonday 2015-04-06 
# 10 EasterMonday 2016-03-28 
# 11 EasterMonday 2017-04-17 
# 12 EasterMonday 2018-04-02