通过从位置数据创建边列表使 data.frame igraph 兼容

making a data.frame igraph compatible by creating edgelist from location data

我目前正在从事一个可视化智库董事会成员及其各自董事会网络的项目。我拥有的数据采用以下格式:

     name edge
1    A    1
2    A    2
3    A    3
4    B    4
5    B    5
6    C    6

但是,为了使其与 igraphs graph_from_data_frame() 函数兼容,我需要以下格式:

   name from to
1    A    1  2
2    A    1  3
3    A    2  3
4    B    4  5
5    C    6  0

我已经试过了

 df1 <- setDT(df1)[, list(edge = toString(edge)), name]
 df1 <- separate(df1, "edge", c("X", "Y", "Z"))

屈服

  name X    Y    Z
1:    A 1    2    3
2:    B 4    5 <NA>
3:    C 6 <NA> <NA>

但是,我不知道如何从这个(或初始格式)到使用所需的格式graph_from_data_frame() 我希望你能帮助我。提前致谢

您可以使用 combn by 每个名称进行小写处理。

by(dat, dat$name, \(x) {
  e <- x$edge
  if (length(e) == 1L) e <- c(e, 0L)
  cbind(x$name[1L], t(combn(e, 2L)))
}) |> 
  do.call(what=rbind.data.frame) |>
  setNames(c('name', 'from', 'to'))
#     name from to
# A.1    A    1  2
# A.2    A    1  3
# A.3    A    2  3
# B      B    4  5
# C      C    6  0

注:R >= 4.1 使用。


数据:

dat <- structure(list(name = c("A", "A", "A", "B", "B", "C"), edge = 1:6), class = "data.frame", row.names = c("1", 
"2", "3", "4", "5", "6"))