如何以邻域列表格式加载图表?

How do I load a graph in neighborhood list format?

我有一个描述有向图的邻域列表文件:

1 2 5
2 4

相当于边列表格式:

1 2
1 5
2 4

如何将其加载到 igraph 中?

我可以使用read.lines and strsplit,但我感觉这已经被其他人做过了。

如果您愿意使用仍在开发中的包,我建议您探索 "iotools" 包。它的文件 reader 是 fast(按照 "data.table" 中的 fread 的思路思考)并且它包含一些拆分功能。将它与我的 "splitstackshape" 包中的 cSplit 结合使用。

这是一个具有 100 万行的可重现示例:

首先,制作一些示例数据的函数:

data.maker <- function(size) {
  set.seed(1)
  lapply(seq_len(size), function(x) {
    as.character(c(x, sample(100, sample(20), TRUE)))
  })
}

x <- data.maker(1000000)
writeLines(vapply(x, paste, FUN.VALUE = character(1L), collapse = "\t"), "mytest.txt")

其次,加载"dplyr"用于管道,"iotools"用于快速读取,"splitstackshape"(也加载"data.table")用于拆分和聚合。

library(dplyr)
library(iotools)
library(splitstackshape)

就在这里,一应俱全:

system.time({
  out <- input.file("mytest.txt", formatter = mstrsplit, sep = NA, nsep = "\t") %>%
    as.data.table(keep.rownames = TRUE) %>%
    cSplit("V1", "\t", "long") %>%
    .[, .N, by = .(rn, V1)]
})
#    user  system elapsed 
#  26.109   0.096  26.200 

输出视图:

out
#               rn V1 N
#       1:       1 94 1
#       2:       1 22 1
#       3:       1 66 1
#       4:       1 13 1
#       5:       1 27 1
#      ---             
# 9865359: 1000000  1 1
# 9865360: 1000000 85 1
# 9865361: 1000000 91 1
# 9865362: 1000000 44 1
# 9865363: 1000000 20 1
summary(out)
#       rn                  V1              N        
#  Length:9865363     Min.   :  1.0   Min.   :1.000  
#  Class :character   1st Qu.: 25.0   1st Qu.:1.000  
#  Mode  :character   Median : 51.0   Median :1.000  
#                     Mean   : 50.5   Mean   :1.064  
#                     3rd Qu.: 75.0   3rd Qu.:1.000  
#                     Max.   :100.0   Max.   :5.000 

如果你喜欢更标准的包,你可以试试下面的。它也应该相当快:

library(dplyr)
library(stringi)
library(data.table)


temp <- stri_split_fixed(readLines("mytest.txt"), "\t", n = 2, simplify = TRUE) %>%
  as.data.table %>%
  .[, list(V2 = unlist(strsplit(V2, "\t", TRUE))), by = V1] %>%
  .[, .N, by = .(V1, V2)]