1

使用 R 编程。我有超过 300 万的 Vendor_id、Bank_account_no 和 Date 的数据集。我想获取 Bank_account_no 更改的每个 vendor_id 的行,例如在三个月内从 X 到 X 到 X (至少三次,可能超过三次)到 Y (仅一次)到 X 。数据集的变化都是随机的,因此窗口不固定为每个 vendor_id 的行数。我使用 rle 函数来获取不同 Bank_account_no 的长度。考虑到我想为每个 vendor_id 运行此逻辑,不确定如何在 R 中为这么多行创建逻辑。可能是 data.table 可以帮助解决这个问题。输入如下:

Vendor_ID   Bank_account_no   Date    

<!-- -->
dddd       X              24-12-2018
dddd       X              24-12-2018
dddd       X              26-12-2018
dddd       Y              27-12-2018
dddd       X              28-12-2018
dddd       X              29-12-2018
dddd       X              29-12-2018
dddd       X              31-12-2018
dddd       X              24-01-2019
dddd       Z              25-01-2019
dddd       X              28-01-2019
dddd       G              28-01-2019
dddd       G              28-01-2019
eeee       A              30-01-2019
eeee       A              31-01-2019
eeee       A              31-01-2019    
eeee       B              31-01-2019
eeee       A              31-01-2019

输出应该是:

Vendor_ID   Bank_account_no   Date    Case

<!-- -->
dddd       X              24-12-2018  Case1
dddd       X              24-12-2018  Case1
dddd       X              26-12-2018  Case1
dddd       Y              27-12-2018  Case1
dddd       X              28-12-2018  Case1
dddd       X              29-12-2018  Case2
dddd       X              29-12-2018  Case2
dddd       X              31-12-2018  Case2
dddd       X              24-01-2019  Case2
dddd       Z              25-01-2019  Case2
dddd       X              28-01-2019  Case2
eeee       A              30-01-2019  Case3
eeee       A              31-01-2019  Case3
eeee       A              31-01-2019  Case3    
eeee       B              31-01-2019  Case3
eeee       A              31-01-2019  Case3
4

1 回答 1

0

There might be edge cases not covered but this is an option to start you off:

#get run length encoding for ID
DT[, r := rleid(ID)]

#identify locations of desired changes in ID
DT[, w := ID!=shift(ID, -1L) & ID==shift(ID, -2L)]

#set to TRUE at the start of a sequence
DT[, sw := replace(shift(w, 3L, fill=FALSE), 1L, TRUE), Vendor_ID]

#filter out those not part of any sequence
ans <- DT[-DT[, {
        ix <- which(w)
        if (length(ix) > 0L) .I[!r %in% r[sapply(ix, `+`, 0L:2L)]]
    }, Vendor_ID]$V1]

#create the desired Case column
ans[, Case := paste0("Case", cumsum(sw))]

output:

    Vendor_ID ID       Date r     w    sw  Case
 1:      dddd  X 24-12-2018 1 FALSE  TRUE Case1
 2:      dddd  X 24-12-2018 1 FALSE FALSE Case1
 3:      dddd  X 26-12-2018 1  TRUE FALSE Case1
 4:      dddd  Y 27-12-2018 2 FALSE FALSE Case1
 5:      dddd  X 28-12-2018 3 FALSE FALSE Case1
 6:      dddd  X 29-12-2018 3 FALSE  TRUE Case2
 7:      dddd  X 29-12-2018 3 FALSE FALSE Case2
 8:      dddd  X 31-12-2018 3 FALSE FALSE Case2
 9:      dddd  X 24-01-2019 3  TRUE FALSE Case2
10:      dddd  Z 25-01-2019 4 FALSE FALSE Case2
11:      dddd  X 28-01-2019 5 FALSE FALSE Case2
12:      eeee  A 30-01-2019 7 FALSE  TRUE Case3
13:      eeee  A 31-01-2019 7 FALSE FALSE Case3
14:      eeee  A 31-01-2019 7  TRUE FALSE Case3
15:      eeee  B 31-01-2019 8    NA FALSE Case3
16:      eeee  A 31-01-2019 9    NA FALSE Case3

data:

library(data.table)
DT <- fread("Vendor_ID   ID   Date    
dddd       X              24-12-2018
dddd       X              24-12-2018
dddd       X              26-12-2018
dddd       Y              27-12-2018
dddd       X              28-12-2018
dddd       X              29-12-2018
dddd       X              29-12-2018
dddd       X              31-12-2018
dddd       X              24-01-2019
dddd       Z              25-01-2019
dddd       X              28-01-2019
dddd       G              28-01-2019
dddd       G              28-01-2019
eeee       A              30-01-2019
eeee       A              31-01-2019
eeee       A              31-01-2019    
eeee       B              31-01-2019
eeee       A              31-01-2019")
于 2019-11-12T00:25:19.230 回答