我有一个描述有向图的邻居列表文件:
1 2 5
2 4
相当于边列表格式:
1 2
1 5
2 4
如何将其加载到igraph?
我可以使用read.lines
和strsplit
,但我觉得以前是由别人做过的。
答案 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)]