问题描述
我有关于在特定医院共同工作的医生组的信息。一名医生可以同时在多家医院工作。我想编写一个代码,输出在给定医院工作的给定医生的所有间接同事的信息。例如,如果我在给定的医院工作,另一位医生也在另一家医院工作,我想知道我的同事在这家医院工作的医生是谁。
考虑三个医院(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 有两个间接同事通过医院 1 的医生 B:他们是医院 2 的医生 D 和医院 3 的医生 E。依此类推..
以下是描述所有医院医生网络的对象:
edges <- tibble(hosp = c("1","1","2","3","3"),from = c("A","A","B","C","D","E"),to = c("C","E","B")) %>% arrange(hosp,from,to)
output <- tibble(hosp = c("1",from = c("A",to = c("C","B"),hosp_ind = c("","","2"),to_ind = c("","D")) %>% arrange(hosp,to)
解决方法
这是一个使用 igraph
+ data.table
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][]
你会得到
> 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