在此输入代码
# source data format code
df <- data.frame(
Parent_Group = c('A', 'A', 'A', 'A', 'A', 'A', 'A', 'B', 'B', 'B', 'B', 'B'),
Group = c('A', 'A', 'A', 'A', 'G1', 'G1', 'G2', 'B', 'B', 'B', 'G11', 'G11'),
Member = c('M1', 'M2', 'M3', 'G1', 'M4', 'G2', 'M5', 'M11', 'M12', 'G11', 'M13', 'M14'),
MbrType = c('User', 'User', 'User', 'Group', 'User', 'Group', 'User', 'User', 'User', 'Group', 'User', 'User')
)
父组可以嵌套用户或另一个 AD 组。实际数据中还存在多层嵌套。
我想要另一列“会员路径”(所需格式如下),可以显示会员资格的完整路径,如下所示:
请注意,每个组的嵌套级别有所不同。
寻求有关如何在 R 中实现这一目标的帮助。
您可以使用
igraph
来构建路径
library(igraph)
g <- graph_from_data_frame(df[c("Group", "Member")])
df %>%
mutate(
Membership_Path = sapply(
shortest_paths(g, unique(Parent_Group), Member)$vpath, \(p) paste0(names(p), collapse = ">")
),
.by = Parent_Group
)
你将获得
Parent_Group Group Member MbrType Membership_Path
1 A A M1 User A>M1
2 A A M2 User A>M2
3 A A M3 User A>M3
4 A A G1 Group A>G1
5 A G1 M4 User A>G1>M4
6 A G1 G2 Group A>G1>G2
7 A G2 M5 User A>G1>G2>M5
8 B B M11 User B>M11
9 B B M12 User B>M12
10 B B G11 Group B>G11
11 B G11 M13 User B>G11>M13
12 B G11 M14 User B>G11>M14
冒着忽略一些显而易见的事情的风险,我可能会在行上进行操作。基础
R
中的一种可能性是
df$Membership_Group =
apply(df[c("Parent_Group", "Group", "Member")], 1L,
\(i) unique(i) |> unlist(i) |> paste(collapse = " > "))
这给出了
> df
Parent_Group Group Member MbrType Membership_Group
1 A A M1 User A > M1
2 A A M2 User A > M2
3 A A M3 User A > M3
4 A A G1 Group A > G1
5 A G1 M4 User A > G1 > M4
6 A G1 G2 Group A > G1 > G2
7 A G2 M5 User A > G2 > M5
8 B B M11 User B > M11
9 B B M12 User B > M12
10 B B G11 Group B > G11
11 B G11 M13 User B > G11 > M13
12 B G11 M14 User B > G11 > M14