最近对freaddata.table版本1.11.0(2018年5月1日)的更改似乎无法识别na.strings带引号的字符列的正确值.
结合使用的默认行为fwrite可以正常工作,如新闻中所述并在下面的工作示例(fread(fwrite(DT))==DT)中显示.
但是,如果使用fwrite(DT, quote = TRUE)模拟write.csv直接使用的文件或写入文件的行为来编写文件write.csv,则fread似乎在检测指定的正确字符串时出现问题na.strings(如下面的非工作示例所示).
dt <- data.table(A = c(1, 2, 3), B = c("a", "b", NA))
fwrite(dt, "testfile.csv")
# expected output
str(fread("testfile.csv", na.strings = c("a", "")))
Classes ‘data.table’ and 'data.frame': 3 obs. of 2 variables:
$ A: int 1 2 3
$ B: chr NA "b" NA
- attr(*, ".internal.selfref")=<externalptr>
Run Code Online (Sandbox Code Playgroud)
规格na.strings似乎工作中使用未加引号字符这个例子就好了.
使用dt上面示例中的data.table :
fwrite(dt, "testfile_quoted.csv", quote = TRUE) # mimicing write.csv
Run Code Online (Sandbox Code Playgroud)
在这里,指定na.strings = ""也给出了预期的结果
str(fread("testfile_quoted.csv", na.strings = ""))
Classes ‘data.table’ and 'data.frame': 3 obs. of 2 variables:
$ A: int 1 2 3
$ B: chr "a" "b" NA
- attr(*, ".internal.selfref")=<externalptr>
Run Code Online (Sandbox Code Playgroud)
但是,尝试na.strings = c("a", "")在上面的示例中指定会产生意外结果:
str(fread("testfile_quoted.csv", na.strings = c("a", "")))
Classes ‘data.table’ and 'data.frame': 3 obs. of 2 variables:
$ A: int 1 2 3
$ B: chr "a" "b" NA
- attr(*, ".internal.selfref")=<externalptr>
Run Code Online (Sandbox Code Playgroud)
列的预期结果B应c(NA, "b", NA)与上面的工作示例相同.
na.strings直接指定引号也不会改变我的结果.
str(fread("testfile_quoted.csv", na.strings = c("\"a\"", "")))
Classes ‘data.table’ and 'data.frame': 3 obs. of 2 variables:
$ A: int 1 2 3
$ B: chr "a" "b" NA
- attr(*, ".internal.selfref")=<externalptr>
Run Code Online (Sandbox Code Playgroud)
我在这里错过了什么吗?
在版本1.11.0之前我没有遇到这些问题.有没有办法恢复旧的行为fread,以保持与旧文件的一致性write.csv?
sessionInfo()
R version 3.5.0 (2018-04-23)
Platform: x86_64-w64-mingw32/x64 (64-bit)
Running under: Windows 7 x64 (build 7601) Service Pack 1
Matrix products: default
locale:
[1] LC_COLLATE=German_Austria.1252 LC_CTYPE=German_Austria.1252
[3] LC_MONETARY=German_Austria.1252 LC_NUMERIC=C
[5] LC_TIME=German_Austria.1252
attached base packages:
[1] stats graphics grDevices utils datasets methods base
other attached packages:
[1] data.table_1.11.0
loaded via a namespace (and not attached):
[1] compiler_3.5.0 tools_3.5.0
[1]: https://github.com/Rdatatable/data.table/blob/master/NEWS.md
Run Code Online (Sandbox Code Playgroud)