为了账号安全,请及时绑定邮箱和手机立即绑定

如何使用 R 或 Python 合并两个 id 列,识别哪些行属于同一组相关 ID

如何使用 R 或 Python 合并两个 id 列,识别哪些行属于同一组相关 ID

一只甜甜圈 2022-07-26 15:45:34
我有 2 个独立创建/收集的 ID 列。我试图通过根据两个 ID 列中的任何一个确定哪些行是同一相关组 id 的一部分,将这两个 ID 列合并为一个列。我会根据一些规则考虑相关的行:1:如果一个LOAN在多行中具有相同的值,则它们属于同一个组(示例中仅供参考)。我称之为loan_group。这里没有问题。2:如果一个 COLLATERAL 在多行中具有相同的值,则它们属于临时组。我称它为lateral_group(与#1 相同的规则。)这里没有问题。3:最后,我不确定如何准确表达这一点,但任何时候属于同一组的值之间存在重叠(跨贷款和抵押列),这些组应该进一步合并。例如:df <- data.frame('LOAN' = c('L1', 'L2', 'L5', 'L2', 'L6', 'L7', 'L8'),                 'COLLATERAL' = c('C1', 'C1', 'C8', 'C4', 'C8', 'C9', 'C4'))df$laon_group <- as.numeric(factor(df$LOAN))df$collateral_group <- as.numeric(factor(df$COLLATERAL))df$final_grouping <- NALOAN  COLLATERAL  loan_group  collateral_group  final_grouping----  ----------- ----------  ----------------  --------------L1    C1*         1           1                 **1**L2**  C1*         2           1                 **1**L5    C8          3           2                 2L2**  C4***       2           3                 **1**L6    C8          4           2                 2L7    C9          5           4                 3L8    C4***       6           3                 **1***因为第 1 行和第 2 行的值都为 C1,所以它们将被分配到相同的最终分组中**因为第 2 行的 LOAN 值为 L2,这意味着我们可以为第 4 行分配“1”的最终分组,因为该行可以通过 L2/C1 链接链接回第 1 行***最后,因为第 4 行包含 COLLATERAL 值 C4,这意味着我们可以在合并的最终分组中包含第 7 行。该行可以通过 L2/C4 和 L2/C1 链接链接回第一行该数据集大约是 15m 个独特的 LOAN + COLLATERAL 组合。在某些边缘情况下,这些组可能会交叉几千个(可能 +1 万个)ID。我在 BQ 测试一些解决方案时遇到了一些资源问题,包括我原来的问题中的建议,这就是为什么我想尝试在 R/Python 中执行此操作
查看完整描述

1 回答

?
天涯尽头无女友

TA贡献1831条经验 获得超9个赞

如果您将此视为图形问题,则可以执行以下操作:


library(igraph)


g <- make_empty_graph(directed = FALSE, n = nrow(tab))


for (loan_id in unique(tab$loan)) {

    loan_idx = which(tab$loan == loan_id)

    if (length(loan_idx) >= 2) {

        g <- g + path(loan_idx)

    }

}


for (collateral_id in unique(tab$collateral)) {

    collateral_idx = which(tab$collateral == collateral_id)

    if (length(collateral_idx) >= 2) {

        g <- g + path(collateral_idx)

    }

}


tab$grouping = components(g)$membership

即,您制作一个图表并在具有匹配贷款或抵押品 ID 的任何行之间添加边。我不确定这是如何优化的,因为forR 中的循环很少是正确的答案。


输出与您的预期输出匹配:


> tab

  loan collateral loan_group collateral_group final grouping

1   L1         C1          1                1     1        1

2   L2         C1          2                1     1        1

3   L5         C8          3                2     2        2

4   L2         C4          2                3     1        1

5   L6         C8          4                2     2        2

6   L7         C9          5                4     3        3

7   L8         C4          6                3     1        1


查看完整回答
反对 回复 2022-07-26
  • 1 回答
  • 0 关注
  • 71 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号