簡體   English   中英

如果單行滿足條件,則使用data.table標記整個組

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM