我有两个数据表:claims
和SC
。它们有一个共同的列——subCoverageKey
。在claims
中,我想创建一个新列subCoverageeyClaim
。对于声明中的每一行,我都想从SC
-aka中获取相应的subCoverageeyClaim
值。通过CCD_ 8进行匹配。在对于subCoverageKey
存在多个subCoverageeyClaim
的情况下,应当进行随机选择。
如何做到这一点?
我尝试过使用sample((,但无法使其工作。
生成的data.table应该是这样的:
claims
clientID claimID claimYear amount clDate subCoverageKey subCoverageKeyClaims
1: 1 OP_a19517b1-5c66-47ca-92de-40c1b1a0b16b 2019 50.01 2019-04-26 IP_accommodation b83f2a41-64c3-4571-97e7-6534f9629104
2: 1 OP_a19517b1-5c66-47ca-92de-40c1b1a0b16b 2019 50.01 2019-04-26 IP_bundle f0a9ee55e-31b1-46f8-a0d4-91154e6c0998
3: 1 OP_a19517b1-5c66-47ca-92de-40c1b1a0b16b 2019 50.01 2019-04-26 IP_accommodation f0a9ee55e-31b1-46f8-a0d4-91154e6c0998
4: 1 OP_064c03aa-f2d5-4768-9c4e-51b54a725e56 2019 78.25 2019-06-09 IP_upgrade 74390be79-dc1e-4f7a-a0c0-f548c0b9ffcb
5: 1 OP_064c03aa-f2d5-4768-9c4e-51b54a725e56 2019 78.25 2019-06-09 Daily_cash 7a61bcf3-9e6d-4c4b-be2b-1381527dedd6
---
2637586: 130999 OP_b165c233-cd77-461b-b37d-704ac647d878 2019 8.66 2019-09-13 IP_upgrade ffdef3f3-2996-4d1a-bf51-a78b43029079
2637587: 130999 OP_0a11b09d-fd4c-427e-ad7b-8c67c2fa70e5 2019 61.16 2019-09-17 Daily_cash 0a9ee55e-31b1-46f8-a0d4-91154e6c0998
2637588: 131000 OP_3fb03980-8642-48bf-8967-55e410243868 2019 12.64 2019-05-10 IP_upgrade 4390be79-dc1e-4f7a-a0c0-f548c0b9ffcb
2637589: 131000 OP_64d85cc6-db73-408a-a02a-6b0c811ee06d 2019 8.44 2019-05-02 IP_bundle ffdef3f3-2996-4d1a-bf51-a78b43029079
2637590: 131000 OP_8b5585d8-d8e0-47ed-9005-3584062d4103 2019 3.57 2019-03-10 IP_accommodation ffdef3f3-2996-4d1a-bf51-a78b43029079
我计划加入的数据表相当大,大约有300000次观测,所以我正在寻找不会花那么多时间的东西。
我找到了我想要的答案:
- 将SC表转换为列表
listSC <- split(SC, SC$subCoverageKeyClaims)
- 使用sapply随机选择相应的subCoverageKeyClaims
claims$subCoverageKeyClaims <- sapply(claims$subCoverageKey, function(x){
sample(listSC[[x]]$subCoverageKey, 1)
})
这里有一种tidyverse
方式:
library(tidyverse)
SC %>%
select(claimID, subCoverageKey) %>%
group_by(subCoverageKey) %>%
nest %>%
ungroup %>%
right_join(claims, by = 'subCoverageKey') %>%
mutate(subCoverageKeyClaims = map_chr(data, ~sample(.x$claimID, 1)))
由于claims
数据集中存在重复,我们在SC
中为相同的subCoverageKey
创建了一个列表列,并将其与claims
数据集连接。然后,我们可以从它们各自的数据中选择一个随机的CCD_ 16值。