我需要根据多层输入对帐户进行分组:
账户 | 1 级 | 2 级 | 3级 |
---|---|---|---|
账户1 | 1 | 21 | 55 |
账户2 | 1 | 21 | 55 |
账户3 | 2 | 52 | 72 |
账户4 | 2 | 52 | 66 |
账户5 | 3 | 52 | 66 |
账户6 | 3 | 52 | 99 |
账号7 | 4 | 63 | 43 |
账号8 | 4 | 63 | 49 |
账号9 | 5 | 36 | 94 |
账户10 | 5 | 42 | 55 |
此处的目标是根据所有 3 层对帐户进行分组。如果账户 A 和 B 在第 1 层中位于同一组,并且如果账户 1、2 和 10 在第 3 层中位于同一组,则账户 1、2、9 和 10 需要分类在同一最终组中。帐户 9 被包含在内,因为它与第 1 层中的帐户 10 分组。
所需输出:
账户 | 1 级 | 2 级 | 3级 | 最后一组 |
---|---|---|---|---|
账户1 | 1 | 21 | 55 | 第 1 组 |
账户2 | 1 | 21 | 55 | 第 1 组 |
账户3 | 2 | 52 | 72 | 第2组 |
账户4 | 2 | 52 | 66 | 第2组 |
账户5 | 3 | 52 | 66 | 第2组 |
账户6 | 3 | 52 | 99 | 第2组 |
账号7 | 4 | 63 | 43 | 第3组 |
账号8 | 4 | 63 | 49 | 第3组 |
账号9 | 5 | 36 | 94 | 第 1 组 |
账户10 | 5 | 42 | 55 | 第 1 组 |
这是一个更大问题的简化版本,该问题有 7 个以上的层,涉及 50 万个数据点。我能想到的每一种方法都遇到了障碍。感觉我错过了一个简单且省时的解决方案。有什么想法吗?
提前致谢!
图论和 igraph 包派上用场的另一个例子,可以找到连接的组件:
## make a two-column 'edgelist' showing the account<-->tier relationships
datlong <- cbind(dat[1], stack(dat[-1]))
library(igraph)
## make a graph object
g <- graph_from_data_frame(datlong[1:2])
## extract the connected components
cmp <- components(g)
## assign the membership of the accounts based on the components
dat$final_group <- cmp$membership[match(dat$Account, names(cmp$membership))]
dat
# Account Tier1 Tier2 Tier3 final_group
#1 Account1 1 21 55 1
#2 Account2 1 21 55 1
#3 Account3 2 52 72 2
#4 Account4 2 52 66 2
#5 Account5 3 52 66 2
#6 Account6 3 52 99 2
#7 Account7 4 63 43 3
#8 Account8 4 63 49 3
#9 Account9 5 36 94 1
#10 Account10 5 42 55 1
dat
在哪里:
dat <- read.table(text="Account Tier1 Tier2 Tier3
Account1 1 21 55
Account2 1 21 55
Account3 2 52 72
Account4 2 52 66
Account5 3 52 66
Account6 3 52 99
Account7 4 63 43
Account8 4 63 49
Account9 5 36 94
Account10 5 42 55", header=TRUE)