[英]Flag an entire group if a single row meets a condition using data.table
我有以下示例數據:
> so <- data.table(Credit_id = rep(c("1-A", "17-F", "2-D"), each = 3), Period = rep(1:3, times = 3), Due_days = c(0,0,0, 0,30,0, 0,30,60))
> so
Credit_id Period Due_days
1: 1-A 1 0
2: 1-A 2 0
3: 1-A 3 0
4: 17-F 1 0
5: 17-F 2 30
6: 17-F 3 0
7: 2-D 1 0
8: 2-D 2 30
9: 2-D 3 60
數據顯示了在投資組合的前三個月中,三種不同的信用表現如何。 Credit_id
是主鍵, Period
是時間索引, Due_days
顯示在給定時間段內客戶的逾期天數。
我想創建一個新列Flag
,它可以采用兩個值:0和1。如果一個貸項(由Credit_id
分組)的Credit_id
曾經等於或大於30,則Flag
的值應為1。
這是我想要得到的結果:
Credit_id Period Due_days Flag
1: 1-A 1 0 0
2: 1-A 2 0 0
3: 1-A 3 0 0
4: 17-F 1 0 1
5: 17-F 2 30 1
6: 17-F 3 0 1
7: 2-D 1 0 1
8: 2-D 2 30 1
9: 2-D 3 60 1
也就是說,將1
分配給在Due_days >= 30
時至少有一行的組。
你可以做:
dt[, flag := +(any(Due_days >= 30)), by = Credit_id]
Credit_id Period Due_days flag
1: 1-A 1 0 0
2: 1-A 2 0 0
3: 1-A 3 0 0
4: 17-F 1 0 1
5: 17-F 2 30 1
6: 17-F 3 0 1
7: 2-D 1 0 1
8: 2-D 2 30 1
9: 2-D 3 60 1
或與base R
相同:
with(dt, ave(Due_days, Credit_id, FUN = function(x) +(any(x >= 30))))
any()
測試每組至少一個值是否滿足條件。 正如@Calum您已經提到的, +
只是將邏輯向量轉換為整數向量的一種快速方法。
為了說明+
的用法:
+(c(TRUE, FALSE))
[1] 1 0
其他可能性是:
c(TRUE, FALSE) * 1
要么:
as.integer(c(TRUE, FALSE))
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.