首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >查找每条边的间接节点(在R中)

查找每条边的间接节点(在R中)
EN

Stack Overflow用户
提问于 2021-04-09 03:58:00
回答 1查看 80关注 0票数 1

我有关于在特定医院一起工作的医生群体的信息。一名医生可以同时在多家医院工作。我想写一个代码,输出在给定医院工作的给定医生的所有间接同事的信息。例如,如果我在一家给定的医院与另一位也在另一家医院工作的医生一起工作,我想知道我的同事在另一家医院与谁一起工作。

考虑三个医院(1,2,3)和五个医生(A,B,C,D,E)的简单示例。医生A、B和C在医院一起工作1.医生A、B和D在医院一起工作2.医生B和E在医院一起工作3.

对于在特定医院工作的每个医生,我希望通过他们的每个直接同事了解他们的间接同事的信息。例如,A医生在1号医院有一个通过B医生的间接同事:这是3号医院的E医生。另一方面,B医生在1号医院没有通过A医生的间接同事。C医生有两个通过B医生在1号医院的间接同事:他们是2号医院的D医生和3号医院的E医生。以此类推。

下面是描述所有医院医生网络的对象:

代码语言:javascript
运行
复制
edges <- tibble(hosp  = c("1", "1", "1", "1", "1", "1", "2", "2", "2", "2", "2", "2", "3", "3"), 
             from = c("A", "A", "B", "B", "C", "C", "A", "A", "B", "B", "D", "D", "B", "E"), 
             to   = c("C", "B", "C", "A", "B", "A", "D", "B", "A", "D", "A", "B", "E", "B")) %>% arrange(hosp, from, to)

我想要一个能产生以下输出的代码:

代码语言:javascript
运行
复制
output <- tibble(hosp     = c("1", "1", "1", "1", "1", "1", "1", "2", "2", "2", "2", "2", "2", "2", "3", "3", "3", "3", "3"), 
             from     = c("A", "A", "B", "B", "C", "C", "C", "A", "A", "B", "B", "D", "D", "D", "B", "E", "E", "E", "E"), 
             to       = c("C", "B", "C", "A", "B", "A", "B", "D", "B", "A", "D", "A", "B", "B", "E", "B", "B", "B", "B"),
             hosp_ind = c("" , "3", "" , "" , "2", "2", "3", "" , "3", "" , "" , "1", "1", "3", "" , "1", "1", "2", "2"),
             to_ind   = c("" , "E", "" , "" , "D", "D", "E", "" , "E", "" , "" , "C", "C", "E", "" , "A", "C", "A", "D")) %>% arrange(hosp, from, to)
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-04-09 05:32:22

以下是使用igraph + data.table的一种选择

代码语言:javascript
运行
复制
library(igraph)
library(data.table)

g <- simplify(graph_from_data_frame(edges, directed = FALSE))
res <- setDT(edges)[
  ,
  c(.SD, {
    to_ind <- setdiff(
      do.call(
        setdiff,
        Map(names, ego(g, 2, c(to, from), mindist = 2))
      ), from
    )
    if (!length(to_ind)) {
      hosp_ind <- to_ind <- NA_character_
    } else {
      hosp_ind <- lapply(to_ind, function(v) names(neighbors(g, v)))
    }
    data.table(
      hosp_ind = unlist(hosp_ind),
      to_ind = rep(to_ind, lengths(hosp_ind))
    )
  }),
  .(id = seq(nrow(edges)))
][, id := NULL][]

你将会得到

代码语言:javascript
运行
复制
> res
    hosp from to hosp_ind to_ind
 1:    1    A  B        3      E
 2:    1    A  C     <NA>   <NA>
 3:    1    B  A     <NA>   <NA>
 4:    1    B  C     <NA>   <NA>
 5:    1    C  A        2      D
 6:    1    C  B        2      D
 7:    1    C  B        3      E
 8:    2    A  B        3      E
 9:    2    A  D     <NA>   <NA>
10:    2    B  A     <NA>   <NA>
11:    2    B  D     <NA>   <NA>
12:    2    D  A        1      C
13:    2    D  B        1      C
14:    2    D  B        3      E
15:    3    B  E     <NA>   <NA>
16:    3    E  B        1      A
17:    3    E  B        2      A
18:    3    E  B        1      C
19:    3    E  B        2      D

此外,当您运行plot(g)时,您将看到如下图

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/67011058

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档