2017-03-23 3 views
3

サービスの日付の後に顧客に請求し、請求していない場合はサービスを停止します。しかし、サービス日付と請求書日付の間の遅れは、顧客が追加のサービスを要求したときに実施することを困難にします。顧客が延滞しているかどうかを判断するには、未払いの請求書が送信された後(サービス日付よりもずっと遅れて送信されている可能性がある)に、新しく要求されたサービスの日付が発生するかどうかを知る必要があります。法案は、彼らの最初のサービスのために送られた前に、彼らは追加のサービスを要求したのであれば、彼らはまだ滞納考えられないグループ別の別の列にある日付の後に1つの列の日付があるかどうかを確認します

サンプルデータ

df <- structure(list(id = structure(c(1L, 2L, 3L, 4L, 1L, 1L, 2L, 3L, 2L, 2L), .Label = c("A", "B", "C", "D"), class = "factor"), service.date = structure(c(1L, 3L, 5L, 6L, 2L, 9L, 4L, 7L, 8L, 10L), .Label = c("2011-01-01", "2011-01-03", "2011-02-01", "2011-03-01", "2011-03-02", "2011-04-02", "2011-05-09", "2011-08-19", "2011-09-02", "2011-09-10"), class = "factor"), bill.date = structure(c(4L, 5L, 2L, 6L, 9L, 1L, 8L, 10L, 3L, 7L), .Label = c("2011-08-09", "2011-08-10", "2011-08-11", "2011-08-12", "2011-08-13", "2011-08-14", "2011-08-15", "2011-08-16", "2011-08-17", "2011-08-19"), class = "factor")), .Names = c("id", "service.date", "bill.date"), class = "data.frame", row.names = c(NA, -10L)) 

# df 
# id service.date  bill.date 
# A 2011-01-01  2011-08-12 
# B 2011-02-01  2011-08-13 
# C 2011-03-02  2011-08-10 
# D 2011-04-02  2011-08-14 
# A 2011-01-03  2011-08-17 
# A 2011-09-02  2011-08-09 
# B 2011-03-01  2011-08-16 
# C 2011-05-09  2011-08-19 
# B 2011-08-19  2011-08-11 
# B 2011-09-10  2011-08-15 

。しかし、法案が発行された後に追加のサービスを要求し、未払いのままであれば、延滞することになります。

ステップ今まで 私の考えは、「毎に、おそらくby()ように、グループ化機能を使用する要因変数「ID」のレベルに関連付けられた最初の「bill.date」を見つけるために、その後、決定され前記「id」レベルに関連付けられた未払いの「bill.date」の後に発生する場合、各「id」レベルに関連付けられた「service.date」を生成し、最終的に論理変数を作成する。ここで私はで終わるしたいもののサンプルです:

所望の成果だから、サンプルデータで

df$delinquent <- c(FALSE, FALSE, FALSE, FALSE, FALSE, TRUE, FALSE, FALSE, TRUE, TRUE) 

#df 

# id service.date bill.date delinquent 
# A  2011-01-01  2011-08-12 FALSE 
# B  2011-02-01  2011-08-13 FALSE 
# C  2011-03-02  2011-08-10 FALSE 
# D  2011-04-02  2011-08-14 FALSE 
# A  2011-01-03  2011-08-17 FALSE 
# A  2011-09-02  2011-08-09 TRUE 
# B  2011-03-01  2011-08-16 FALSE 
# C  2011-05-09  2011-08-19 FALSE 
# B  2011-08-19  2011-08-11 TRUE 
# B  2011-09-10  2011-08-15 TRUE 

は、4「顧客(名前はA、B、Cがあり、 D)、そのうち2つは未払いの請求書があるにもかかわらずサービスを受けるために延滞(AとB)とマークされます。

答えて

3
# Load some tidyverse libraries 
require(dplyr) 

# Convert factor dates to actual dates 
df <- df %>% mutate(service.date = as.Date(service.date), 
        bill.date = as.Date(bill.date)) 

# If service date is later than earliest bill.date in each group, return delinquent 
df %>% group_by(id) %>% mutate(delinquent = service.date > min(bill.date)) 
2

はどのようにこのようdata.tableの使用について:

library(data.table) 

dt<-as.data.table(df) 
dt[order(as.Date(service.date),as.Date(bill.date)), 
    delinquent:=(cumsum(as.Date(service.date)>=as.Date(bill.date))>=1L), 
    by=id] 


# id service.date bill.date delinquent 
# 1: A 2011-01-01 2011-08-12  FALSE 
# 2: B 2011-02-01 2011-08-13  FALSE 
# 3: C 2011-03-02 2011-08-10  FALSE 
# 4: D 2011-04-02 2011-08-14  FALSE 
# 5: A 2011-01-03 2011-08-17  FALSE 
# 6: A 2011-09-02 2011-08-09  TRUE 
# 7: B 2011-03-01 2011-08-16  FALSE 
# 8: C 2011-05-09 2011-08-19  FALSE 
# 9: B 2011-08-19 2011-08-11  TRUE 
#10: B 2011-09-10 2011-08-15  TRUE 

これは、彼らが過去に少なくとも一度滞納している場合、誰かが滞納を検討したいと仮定しています。

編集:任意の並べ替えを必要とせずにそれを行うための方法、@Vloに触発さ:

dt[,delinquent:=as.Date(service.date)>=min(as.Date(bill.date)),by=id] 
関連する問題