按相关实体对数据框进行分组

3

我有一个数据框,其中包含(除了其他字段外)id号码和cust账户:

 ID  Cust_acc
 1     22
 1     33
 2     33
 3     44
 4     44
 4     55 

如您所见,一个账户可以拥有多个id,同样一个id也可以对应多个账户。
我希望将数据分成不同的相关组,以便所有相关的实体都在同一组中(这样我就可以在同一个地方处理所有相关的 账户id)。
因此,在我的例子中,我想要得到2个组:
# first
    ID  Cust_acc
     1     22
     1     33
     2     33

# second
    ID  Cust_acc
     3     44
     4     44
     4     55  

感谢您的帮助!


你如何定义相关? - Roman Luštrik
根据我的示例定义,如果您对该组有“一个”连接,则应该加入该组;即,如果“id”有2个“账户”,则它们应该在同一组中。然后,如果其中一个“账户”有其他“id”,他也应该在其中(以此类推,直到完成)。 - staove7
我认为这需要igraph。 - akrun
@akrun 我在一个封闭的环境中工作 :( ... 添加新包需要很长时间.. 你能想到其他的做法吗? - staove7
2个回答

4

使用igraph将更容易实现。将data.frame转换为graph对象('g1'),从clusters中提取membership,根据'ID'列子集化membershipnames,创建分组变量以split原始数据集。

library(igraph)
g1 <- graph.data.frame(df1)
cl <- clusters(g1)$membership
split(df1, cl[names(cl) %in% df1$ID][df1$ID])
$`1`
#  ID Cust_acc
#1  1       22
#2  1       33
#3  2       33

#$`2`
#  ID Cust_acc
#4  3       44
#5  4       44
#6  4       55

数据

df1 <- structure(list(ID = c(1L, 1L, 2L, 3L, 4L, 4L), Cust_acc = c(22L, 
33L, 33L, 44L, 44L, 55L)), .Names = c("ID", "Cust_acc"), 
 class = "data.frame", row.names = c(NA, 
-6L))

1
太棒了!(我在我的私人电脑上使用样本数据框进行了检查)非常感谢 :) - staove7
1
在您的允许下,我会投票给其他答案,因为我在评论中写道,我不想使用igraph。此外,我想问您一件事:您的代码如何知道仅考虑IDCust_acc?即,我添加了另一列与Cust_acc共享常见值,但它并没有影响您的代码分组。提前感谢您的回答。 - staove7
抱歉打扰您了...我正在尝试在我的数据集上使用igraph,但是当我运行代码时,只得到了一个组。我检查了过程,似乎问题出在cl[names(cl) %in% df1$ID][df1$ID]这一行,因为它给了我一些NA值。您能告诉我这是为什么吗? - staove7
@staove7 我不确定。根据我发布的数据,它对我来说运行良好。 - akrun
1
@staove7 或许你想要一个非 igraph 的解决方案,可以尝试使用以下代码:i1 <- with(df2, match(Customer_IP, unique(Customer_IP))); cl[names(cl) %in% df2$Customer_IP][i1] - akrun
显示剩余7条评论

1
要仅使用基本的 R 语言实现此操作,需要创建一个分组变量,然后使用 split 函数进行拆分。
group = 1
for(i in 2:nrow(df)){
    if (df$ID[i] %in% df$ID[1:(i-1)]) {
        group[i] = group[which(df$ID == df$ID[i])[1]]
    }else if (df$Cust_acc[i] %in% df$Cust_acc[1:(i-1)]) {
        group[i] = group[which(df$Cust_acc == df$Cust_acc[i])[1]]
    }else{
        group[i] = max(group) + 1
    }
}

split(df, group)    
#1`
#  ID Cust_acc
#1  1       22
#2  1       33
#3  2       33

#$`2`
#  ID Cust_acc
#4  3       44
#5  4       44
#6  4       55

1
太棒了!非常感谢。 - staove7

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接