在 R 中获取嵌套 AD 组成员路径

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

我有以下格式的 AD 组成员资格:

在此输入代码

    # 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 中实现这一目标的帮助。

r dataframe igraph
2个回答
0
投票

您可以使用

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

0
投票

冒着忽略一些显而易见的事情的风险,我可能会在行上进行操作。基础

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