我建议您探索“readr”包中的
read_fwf
。您可以执行以下操作:
library(readr)
len <- nchar(readLines("yourfile.txt", n = 1))
read_fwf("yourfile.txt", fwf_widths(rep(1, len)))
另外,您可以尝试使用“iotools”包,这可能会更快:
library(iotools)
len <- nchar(readLines("yourfile.txt", n = 1))
input.file("yourfile.txt", formatter = dstrfw,
col_types = rep("integer", len), widths = rep(1, len))
这是一个小型的POC(概念验证)示例:
a <- tempfile()
writeLines("0101010100101010101010101010
1010101001010101010101010111
1111101010101010100101010101", a)
len <- nchar(readLines(a, n = 1))
library(readr)
read_fwf(a, fwf_widths(rep(1, len)))
您的数据维度似乎使得read_fwf
无法处理。我进行了一个小测试,比较了“iotools”方法和awk
+fread
。
这是样例数据:
set.seed(1)
A <- replicate(10, sample(0:1, 70000, TRUE), FALSE)
A <- sapply(A, paste, collapse = "")
writeLines(rep(A, 800/length(A)), "somefile.txt")
以下是功能和结果。我编写了这些函数,让您可以尝试在实际数据上使用它们,以查看哪个效果最佳。
显然,目前来看,似乎
readr
已经被排除在外了 :-)
Freadr <- function(infile = "somefile.txt") {
len <- nchar(readLines(infile, n = 1))
read_fwf(infile, fwf_widths(rep(1, len)))
}
system.time(temp1 <- Freadr())
Fiotools <- function(infile = "somefile.txt") {
len <- nchar(readLines(infile, n = 1))
input.file(infile, formatter = dstrfw,
col_types = rep("integer", len), widths = rep(1, len))
}
system.time(temp2 <- Fiotools())
Fawk <- function(infile = "somefile.txt") {
cmd <- sprintf("awk '{gsub(/./,\"&,\", $1);print $1}' %s", infile)
fread(cmd)
}
system.time(temp3 <- Fawk())
那么,使用基础的R语言也不算太糟糕:
fun4 <- function(infile = "somefile.txt") {
do.call(rbind, lapply(strsplit(readLines(infile), "", TRUE), as.numeric))
}
system.time(fun4())
这里的结果是一个矩阵
,因此如果您确实需要将其转换为data.frame
或data.table
,则可能需要增加几秒钟的时间。
AnandaMahto
帖子中的sprintf
能够帮助吗? - akrunfor
循环或者lapply
结合我分享的Fawk
函数。我不明白为什么会卡住。 - A5C1D2H2I1M1N2O1R2T1[,1] [,2]
[1,] 800 800 [2,] 70001 70001` - akrun