2016-08-31 30 views
2

Rに慣れていて、たくさんのことを学びました。2つの日付の間の営業日を計算してください

私の販売データセットには、製品、bpid、日付があります。同じbpid(土曜日の土曜日の土曜日の除外日:&日曜日)の間のビジネスの違いを計算したいと思います。

製品またはbpidが変更された場合(または新しいbpid /製品が導入された場合)は、計算をスキップする必要があります。

df <- data.frame(product=c('milk','milk','milk','milk','eggs','eggs','eggs','eggs'), 
        bpid=c(400,400,500,500,400,400,500,500), 
        date=c("2016-08-03","2016-08-10","2016-08-04","2016-08-10","2016-08-10","2016-08-16","2016-08-11","2016-08-15")); 

df$date <- as.Date(df$date, format = "%Y-%m-%d"); 

私の希望する結果は以下のようになります。 助けてください....

product bpid  date compute-result 
    milk 400 2016-08-03  0 
    milk 400 2016-08-10  5 
    milk 500 2016-08-04  0 
    milk 500 2016-08-10  5 
    eggs 400 2016-08-10  0 
    eggs 400 2016-08-16  4 
    eggs 500 2016-08-11  0 
    eggs 500 2016-08-15  2 

実データコード(結果の列で取得ゼロ)例えば

df <- data.frame(product=c('Keyt','Keyt','Keyt','Keyt','Keyt','Keyt'), 
       bpid=c(30057,30057,30057,30058,30058,30058), 
       date=c("2014-11-21","2015-05-05","2015-05-11","2014-10-16","2014-11-03","2016-03-15")); 

df$date <- as.Date(df$date, format = "%Y-%m-%d"); 

cal <- Calendar(weekdays=c("saturday", "sunday")) 
df$`compute-result` <- 0 
idx <- seq(1, nrow(df),2) 
df$`compute-result`[idx+1] <- bizdays(df$date[idx], df$date[idx+1], cal) 
df 
+0

lubridate' 'で' wday() '関数をチェック。それは、あなたが歩み寄りに乗るのを助けるはずです。 – CephBirk

+0

また、['bizdays'](https://cran.r-project.org/web/packages/bizdays/)パッケージまたは[' timeDate'](https://cran.r-project.org/web/packages/timeDate /)パッケージには、週末や休日を検索する機能があります。 – eipi10

+0

RQuantLibパッケージを使用して、カレンダーのすべての休日を除外することができます – MFR

答えて

3

# install.packages("bizdays") 
library(bizdays) 
cal <- Calendar(weekdays=c("saturday", "sunday")) 
df$`compute-result` <- 0 
idx <- seq(1, nrow(df),2) 
df$`compute-result`[idx+1] <- bizdays(df$date[idx], df$date[idx+1], cal) 
df 
# product bpid  date compute-result 
# 1 milk 400 2016-08-03    0 
# 2 milk 400 2016-08-10    5 
# 3 milk 500 2016-08-04    0 
# 4 milk 500 2016-08-10    4 
# 5 eggs 400 2016-08-10    0 
# 6 eggs 400 2016-08-16    4 
# 7 eggs 500 2016-08-11    0 
# 8 eggs 500 2016-08-15    2 

あなたがグループにしたい場合productbpidでお試しください。

# install.packages("bizdays") 
library(bizdays) 
cal <- Calendar(weekdays=c("saturday", "sunday")) 
with(df, ave(as.integer(date), product, bpid, FUN=function(x) { 
    x <- as.Date(x, origin="1970-01-01") 
    c(0, bizdays(head(x, -1), tail(x, -1), cal)) 
})) -> df$result 
df 
# product bpid  date result 
# 1 Keyt 30057 2014-11-21  0 
# 2 Keyt 30057 2015-05-05 117 
# 3 Keyt 30057 2015-05-11  4 
# 4 Keyt 30058 2014-10-16  0 
# 5 Keyt 30058 2014-11-03  12 
# 6 Keyt 30058 2016-03-15 356 

さもなければaveがエラーをスローするためintegerとバック関数内Datedateに変換される。注:

Error in as.Date.numeric(value) : 'origin' must be supplied 
and I dunno how to supply that origin argument here. 
+0

あなたはロックスターです!あなたをハンク。ところで、あなたのプログラムが新しいbpidや製品をどうピックしているか説明できますか?私は新しいですし、あなたの説明は他の場所で同じ論理を適用するのに役立ちます。 – Murali

+0

私は新製品とbpidsから抽象化しましたが、ちょうど2-1、4-3などの違いを計算しました – lukeA

+0

@ lukeA実データを実験し始めます。しかし、私はこのエラーが発生し続けています。ここで私を助けてくれますか?私は元の投稿に自分のコードを追加しました.. "Real Data"。 – Murali

関連する問題