2017-11-08 4 views
1

特定の日付以降の営業日数を返し、NAsを考慮して営業日を日付に追加する機能を希望します ただし、私の解決策はお粗末で、よりエレガントな方法が必要です。締め切りからの取引日数を整数として返し、dplyrを使用して取引日を追加します

library(dplyr) 
library(timeDate) 
library(RQuantLib) 
library(lubridate) 


item <- c("a", "b") 
date1 = as.Date(c("2017-11-30", "2017-11-01")) 
date2 = as.Date(c("2017-12-01", "2017-11-16")) 
d <- data.frame(item, date1, date2, stringsAsFactors=F) 

line3 <- c("c", "2017-12-03", NA) 
line4 <- c("d", NA, "2017-12-03") 
d <- rbind(d, line3, line4) 

この機能は機能しますが、複数の項目で非常に遅く実行され、わかりやすく表示されません。

bizDeadline <- function(x, nBizDys = 10) { 
    output <- Reduce(rbind, Map((function(x, howMuch = 15) { 
    x <- as.Date(x, origin = "1960-01-01") 
    days <- x + 1:(howMuch * 2) 
    Deadline <- days[isBizday(as.timeDate(days))][howMuch] 
    data.frame(DateIn = x, Deadline, DayOfWeek = weekdays(Deadline), TimeDiff = difftime(Deadline, 
                         x)) 
    }), x, howMuch = nBizDys)) 
    output$Deadline 
} 

これは休日と週末を除外するのに理想的です。

d %>% mutate(deadline = bizDeadline(date1, 10)) 

d$DaysOverdue <- NA 

これはループで機能しますが、ベクター化されたMutateでは機能しません。 RQuantLibから

i = 1 
for(i in 1:nrow(d)){ 
    d$DaysOverdue[i] = businessDaysBetween("UnitedStates", d$date1[i], today()) 
} 

この関数は、

d %>% mutate(od = businessDaysBetween("UnitedStates", date1, today()) 

任意のより良い解決策をベクトル化されていないようですか?

答えて

0

したがって、RでVectorizeの機能を使用することをお勧めします。これは、一部の機能をベクトル化するのは簡単です。 P.S.この関数は、NA

businessDaysBetween_vec <- Vectorize(businessDaysBetween,vectorize.args = c('from', 'to')) 

d[1:2,] %>% mutate(od = businessDaysBetween_vec("UnitedStates", date1, today())) 


#Checking and comparing speed of solution 
foo_loop <- function() { 
    for(i in 1:2){ 
    d$DaysOverdue[i] = businessDaysBetween("UnitedStates", d$date1[i], today()) 
    } 
} 
require(microbenchmark) 
require(ggplot2) 
res <- microbenchmark(businessDaysBetween_vec(),foo_loop(),times = 1e5) 
autoplot(res) 

result

に対処することができません
関連する問題