填充fread的选项

nig*_*tar 13 r data.table

假设我有这个txt文件:

"AA",3,3,3,3
"CC","ad",2,2,2,2,2
"ZZ",2
"AA",3,3,3,3
"CC","ad",2,2,2,2,2
Run Code Online (Sandbox Code Playgroud)

read.csv我可以:

> read.csv("linktofile.txt", fill=T, header=F)
  V1 V2 V3 V4 V5 V6 V7
1 AA  3  3  3  3 NA NA
2 CC ad  2  2  2  2  2
3 ZZ  2 NA NA NA NA NA
4 AA  3  3  3  3 NA NA
5 CC ad  2  2  2  2  2
Run Code Online (Sandbox Code Playgroud)

但是fread给出了

> library(data.table)

> fread("linktofile.txt")
   V1 V2 V3 V4 V5 V6 V7
1: CC ad  2  2  2  2  2
Run Code Online (Sandbox Code Playgroud)

我能得到相同的结果fread吗?

Mat*_*wle 7

不是现在; 我不知道read.csv填充功能.计划是添加读取双重定界文件的能力(sep2以及sep如上所述?fread).然后可以将可变长度矢量读入list列中,其中每个单元本身是矢量.但是,不要用NA填充.

你可以把它添加到列表中吗?这样,当状态发生变化时,您会收到通知.

那里有很多不规则的数据格式吗?我只记得曾经看到常规文件,其中不完整的行将被视为错误.

更新:不太可能完成.fread针对常规分隔文件(每行具有相同的列数)进行了优化.但是,listsep2实现时,不规则文件可以被读入列(每个单元本身是一个向量); 没有填写单独的列read.csv.


A5C*_*2T1 7

重大更新

看起来发展计划fread有所改变,fread现在已经获得了fill争论.

使用本答案末尾的相同样本数据,这是我得到的:

library(data.table)
packageVersion("data.table")
# [1] ‘1.9.7’
fread(x, fill = TRUE)
#    V1 V2 V3 V4 V5 V6 V7
# 1: AA  3  3  3  3 NA NA
# 2: CC ad  2  2  2  2  2
# 3: ZZ  2 NA NA NA NA NA
# 4: AA  3  3  3  3 NA NA
# 5: CC ad  2  2  2  2  2
Run Code Online (Sandbox Code Playgroud)

使用以下命令安装"data.table"的开发版本:

install.packages("data.table", 
                 repos = "https://Rdatatable.github.io/data.table", 
                 type = "source")
Run Code Online (Sandbox Code Playgroud)

原始答案

这不能回答你的问题fread:@Matt已经解决了这个问题.

但是,它确实为您提供了一种替代方案,可以考虑为您提供比基本R更快的速度改进read.csv.

与此不同的是fread,您必须通过向他们提供有关您尝试阅读的数据的一些信息来帮助解决这些问题.

您可以使用input.file"iotools"中的功能.通过指定列类型,您可以告诉formatter函数需要多少列.

library(iotools)
input.file(x, formatter = dstrsplit, sep = ",",
           col_types = rep("character", max(count.fields(x, ","))))
Run Code Online (Sandbox Code Playgroud)

样本数据

x <- tempfile()
myvec <- c('"AA",3,3,3,3', '"CC","ad",2,2,2,2,2', '"ZZ",2', '"AA",3,3,3,3', '"CC","ad",2,2,2,2,2')
cat(myvec, file = x, sep = "\n")

## Uncomment for bigger sample data
## cat(rep(myvec, 200000), file = x, sep = "\n")
Run Code Online (Sandbox Code Playgroud)