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

时间:2017-03-01 17:07:42

标签: r grouping

我有以下数据框,其中包含(以及其他字段)id个数字和cust帐户:

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

如您所见,一个帐户可以有多个id,一个id可以拥有多个帐户。

我想将数据拆分为相关的组,以便所有相关实体都在一个组中(原因是我希望所有相关的 accountsid将在一个地方处理)。

所以在我的例子中,我想得到两组:

# first
    ID  Cust_acc
     1     22
     1     33
     2     33

# second
    ID  Cust_acc
     3     44
     4     44
     4     55  

我们将非常感谢您的帮助!

2 个答案:

答案 0 :(得分:4)

使用igraph会更容易。将data.frame转换为graph对象('g1'),从membership中提取clusters,基于names的{​​{1}}子集在“ID”列上,创建一个分组变量到membership原始数据集

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

答案 1 :(得分: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