我有以下数据框,其中包含(以及其他字段)id
个数字和cust
帐户:
ID Cust_acc
1 22
1 33
2 33
3 44
4 44
4 55
如您所见,一个帐户可以有多个id
,一个id
可以拥有多个帐户。
我想将数据拆分为相关的组,以便所有相关实体都在一个组中(原因是我希望所有相关的 accounts
和id
将在一个地方处理)。
所以在我的例子中,我想得到两组:
# first
ID Cust_acc
1 22
1 33
2 33
# second
ID Cust_acc
3 44
4 44
4 55
我们将非常感谢您的帮助!
答案 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