基于多列对数据进行分组 - R

问题描述 投票:0回答:1

我需要根据多层输入对帐户进行分组:

账户 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 万个数据点。我能想到的每一种方法都遇到了障碍。感觉我错过了一个简单且省时的解决方案。有什么想法吗?

提前致谢!

r dataframe dplyr
1个回答
0
投票

图论和 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)
© www.soinside.com 2019 - 2024. All rights reserved.