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

时间:2015-04-07 17:32:46

标签: r igraph

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

1 2 5
2 4

相当于边列表格式:

1 2
1 5
2 4

如何将其加载到igraph?

我可以使用read.linesstrsplit,但我觉得以前是由别人做过的。

1 个答案:

答案 0 :(得分:1)

如果您愿意使用仍在开发中的软件包,我建议您浏览"iotools"软件包。它的文件阅读器 fast (从“data.table”的fread开始思考)它包含一些分裂功能。与我的“splitstackshape”包中的cSplit结合使用。

以下是1M行的可重现示例:

首先,制作一些样本数据的函数:

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)]