如何以邻域列表格式加载图表?
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)]
我有一个描述有向图的邻域列表文件:
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)]