版本1.11.0中引用字符列的fread行为

时间:2018-05-08 07:53:08

标签: r data.table

最近对data.table版本1.11.0(2018年5月1日)fread的更改似乎无法识别带引号字符列的na.strings的正确值。

fwrite结合使用的默认行为可以正常工作,如NEWS中所述,并在下面的工作示例中显示(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> 

在此示例中使用不带引号的字符,na.strings的规范似乎工作得很好。

非工作示例

使用上面示例中的data.table dt

fwrite(dt, "testfile_quoted.csv", quote = TRUE)  # mimicing write.csv

此处,指定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> 

但是,尝试在上面的示例中指定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> 

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> 

我在这里遗漏了什么吗?

我在版本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

0 个答案:

没有答案