r fread:如何在没有分隔符的情况下读取txt

r fread:如何在没有分隔符的情况下读取txt,r,R,我有一个类似txt的 0010 1101 1110 我希望将fread()txt放入数据框中,就像 01 0 10101 110 虽然fread()+strsplit()可以做到这一点,但将其应用于>1M行的时间太长。有没有办法告诉fread()将每一行直接拆分为单个字符/整数?感谢您的帮助。文档中提到的data.table::fread不支持此操作 调用data.frame::fread不能做到这一点 > data.table::fread("test.txt", d

我有一个类似txt的

0010

1101

1110

我希望将fread()txt放入数据框中,就像

01 0

10101

110


虽然fread()+strsplit()可以做到这一点,但将其应用于>1M行的时间太长。有没有办法告诉fread()将每一行直接拆分为单个字符/整数?感谢您的帮助。

文档中提到的
data.table::fread
不支持此操作

调用
data.frame::fread
不能做到这一点

> data.table::fread("test.txt", data.table=FALSE, sep="")
    V1
1 1001
2 1101
3 1011
例如,
readLines
将作为向量读取,
strsplit
将返回一个列表

> readLines("test.txt")
[1] "1001" "1101" "1011"
> strsplit(readLines("test.txt"), "")
[[1]]
[1] "1" "0" "0" "1"

[[2]]
[1] "1" "1" "0" "1"

[[3]]
[1] "1" "0" "1" "1"
因为data.frame是一个列表,其中每个元素都是一列,所以需要对其进行转置

> t(as.data.frame(strsplit(readLines("test.txt"), "")))
                      [,1] [,2] [,3] [,4]
c..1....0....0....1.. "1"  "0"  "0"  "1" 
c..1....1....0....1.. "1"  "1"  "0"  "1" 
c..1....0....1....1.. "1"  "0"  "1"  "1" 

文档中提到的
data.table::fread
不支持这一点

调用
data.frame::fread
不能做到这一点

> data.table::fread("test.txt", data.table=FALSE, sep="")
    V1
1 1001
2 1101
3 1011
例如,
readLines
将作为向量读取,
strsplit
将返回一个列表

> readLines("test.txt")
[1] "1001" "1101" "1011"
> strsplit(readLines("test.txt"), "")
[[1]]
[1] "1" "0" "0" "1"

[[2]]
[1] "1" "1" "0" "1"

[[3]]
[1] "1" "0" "1" "1"
因为data.frame是一个列表,其中每个元素都是一列,所以需要对其进行转置

> t(as.data.frame(strsplit(readLines("test.txt"), "")))
                      [,1] [,2] [,3] [,4]
c..1....0....0....1.. "1"  "0"  "0"  "1" 
c..1....1....0....1.. "1"  "1"  "0"  "1" 
c..1....0....1....1.. "1"  "0"  "1"  "1" 

您可以将其读取为固定宽度文件,以将每个字符作为单独的列

data <- read.fwf('temp.txt', rep(1, 4))

data您可以将其作为固定宽度文件读取,以将每个字符作为单独的列

data <- read.fwf('temp.txt', rep(1, 4))

data您可以使用
data.table
中的
tsrtsplit
,这样可以很好地提高速度

library(data.table)
raw <- sample(1000:9999, size = 100000, replace = TRUE)
writeLines(as.character(raw), con = "tst.txt")

# Tom Kelly's suggestion
system.time(tmp1 <- t(as.data.frame(strsplit(readLines("tst.txt"), ""))))

# user  system elapsed 
# 19.280   0.522  22.109 

# with tstrsplit
system.time({
  tmp2 <- fread(file = "tst.txt", colClasses = "character")
  tmp2[, c("var1", "var2", "var3", "var4") := tstrsplit(V1, split = "")]})

# user  system elapsed 
# 0.089   0.002   0.099 

# read.fwf
system.time(tmp3 <- read.fwf('tst.txt', rep(1, 4)))

# user  system elapsed 
# 1.308   2.301   3.666 
库(data.table)

raw您可以使用
tsrtsplit
from
data.table
来代替,这可以很好地提高速度

library(data.table)
raw <- sample(1000:9999, size = 100000, replace = TRUE)
writeLines(as.character(raw), con = "tst.txt")

# Tom Kelly's suggestion
system.time(tmp1 <- t(as.data.frame(strsplit(readLines("tst.txt"), ""))))

# user  system elapsed 
# 19.280   0.522  22.109 

# with tstrsplit
system.time({
  tmp2 <- fread(file = "tst.txt", colClasses = "character")
  tmp2[, c("var1", "var2", "var3", "var4") := tstrsplit(V1, split = "")]})

# user  system elapsed 
# 0.089   0.002   0.099 

# read.fwf
system.time(tmp3 <- read.fwf('tst.txt', rep(1, 4)))

# user  system elapsed 
# 1.308   2.301   3.666 
库(data.table)

我建议使用
DT[,paste0(“var”,1:length(tstrsplit(DT$V1,”)):=tstrsplit(V1,”)
进行拆分,因此您不必手动键入所有列名。是的,根据输入数据,最好事先定义,不必运行两次
tstrsplit()
。或者可以使用类似于
max(nchar(V1))
的东西进行拆分,我建议使用
DT[,paste0(“var”,1:length(tstrsplit(DT$V1,”)):=tstrsplit(V1,”)”)
进行拆分,因此您不必手动键入所有列名。是的,根据输入数据,最好事先定义它,而不必运行
tstrsplit()
两次。或者可以使用类似于
max(nchar(V1))