С недавними изменениями в fread
в data.table Версия 1.11.0 (1 мая 2018 г.), похоже, испытывает затруднения при распознавании правильных значений 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