gpt4 book ai didi

R - 读取没有分隔符的二进制矩阵

转载 作者:行者123 更新时间:2023-12-02 06:54:20 25 4
gpt4 key购买 nike

我正在尝试在 R 中读取一个大的(~100mb)二进制矩阵。这就是明文的样子:

10001010
10010100
00101101

预期输出:

  V1 V2 V3 V4 V5 V6 V7 V8
r1 1 0 0 0 1 0 1 0
r2 1 0 0 1 0 1 0 0
r3 0 0 1 0 1 1 0 1

我目前正在阅读每一行并将位分开。有没有更有效的方法来做到这一点?

最佳答案

base R 选项(可能很慢)是扫描 .txt 文件,拆分""分隔符的元素,转换为numeric/integerrbindlist元素创建一个矩阵

 m1 <- do.call(rbind,lapply(strsplit(scan("inpfile.txt", 
what=""), ""), as.numeric))
m1
# [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8]
#[1,] 1 0 0 0 1 0 1 0
#[2,] 1 0 0 1 0 1 0 0
#[3,] 0 0 1 0 1 1 0 1

稍微快一点的版本是使用fread读取文件,然后使用tstrsplit

library(data.table)
fread("inpfile.txt", colClasses="character")[, tstrsplit(V1, "")]
# V1 V2 V3 V4 V5 V6 V7 V8
#1: 1 0 0 0 1 0 1 0
#2: 1 0 0 1 0 1 0 0
#3: 0 0 1 0 1 1 0 1

我还会通过使用 awk(如果 OP 使用的是 linux)在每个字符之间创建空格来更改分隔符,然后使用 fread 读取>(我无法测试它,因为我在 windows 系统上。)


更快的选择可能还包括使用 library(iotools)

n <- nchar(scan(file, what="",n=1))
library(iotools)
input.file("inpfile.txt", formatter=dstrfw,
col_types=rep("integer",n), widths=rep(1,n))
# V1 V2 V3 V4 V5 V6 V7 V8
#1 1 0 0 0 1 0 1 0
#2 1 0 0 1 0 1 0 0
#3 0 0 1 0 1 1 0 1

基准

使用稍大的数据集,readriotools 之间的时序如下。

n <-100000
cat(gsub("([[:alnum:]]{8})", "\\1\n", paste(sample(0:1,
n*8, TRUE), collapse="")),
file="dat2.txt")
library(readr)
tic <- Sys.time()
read_fwf("dat2.txt", fwf_widths(rep(1, 8)))
difftime(Sys.time(), tic)
#Time difference of 1.142145 secs

tic <- Sys.time()
input.file("dat2.txt", formatter=dstrfw,
col_types=rep("integer",8), widths=rep(1,8))
difftime(Sys.time(), tic)
#Time difference of 0.7440939 secs

library(LaF)
tic <- Sys.time()
laf <- laf_open_fwf("dat2.txt", column_widths = rep(1,
8), column_types=rep("integer", 8))
## further processing (larger in memory)
dat <- laf[,]
difftime(Sys.time(), tic)
#Time difference of 0.1285172 secs

到目前为止最有效的是@Tyler Rinker 发布的library(LaF),其次是library(iotools)

关于R - 读取没有分隔符的二进制矩阵,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34834928/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com