r fread:如何在没有分隔符的情况下读取txt
我有一个类似txt的 0010 1101 1110 我希望将fread()txt放入数据框中,就像 01 0 10101 110r 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
虽然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
fromdata.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))