Это то, что я подумал, что я должен спросить этот вопрос. Я хотел бы подтвердить, если это ошибка/несогласованность, прежде чем записывать ее как таковой в трекер R-forge.
Рассмотрим это data.table
:
require(data.table)
DT <- data.table(x=c(1,0,NA), y=1:3)
Теперь, чтобы получить доступ ко всем строкам DT, которые не являются 0, мы могли бы сделать это следующими способами:
DT[x != 0]
# x y
# 1: 1 1
DT[!(x == 0)]
# x y
# 1: 1 1
# 2: NA 3
Доступ к DT[x != 0]
и DT[!(x==0)]
дает разные результаты, когда базовая логическая операция эквивалентна.
Примечание.. Преобразование этого в файл data.frame и выполнение этих операций даст результаты, идентичные друг другу для обеих логически эквивалентных операций, но этот результат отличается от обоих данных data.table, Для объяснения причины смотрите ?`[`
в разделе NAs in indexing
.
Изменить:. Поскольку некоторые из вас подчеркнули для равенства с data.frame
, здесь фрагмент вывода из тех же операций в data.frame:
DF <- as.data.frame(DT)
# check ?`[` under the section `NAs in indexing` as to why this happens
DF[DF$x != 0, ]
# x y
# 1 1 1
# NA NA NA
DF[!(DF$x == 0), ]
# x y
# 1 1 1
# NA NA NA
Я думаю, что это несогласованность, и оба должны обеспечить тот же результат. Но, в результате? В документации для [.data.table
говорится:
i --- > Целое число, логический или символьный вектор, выражение имен столбцов, списка или data.table.
целочисленные и логические векторы работают так же, как и в [.data.frame. Помимо NA в логическом i, они рассматриваются как FALSE, и один логический элемент NA не перерабатывается, чтобы соответствовать количеству строк, как это показано в [.data.frame.
Это ясно, почему результаты отличаются от того, что можно получить от выполнения той же операции на data.frame
. Но все же, в data.table, если это так, то оба из них должны возвращать:
# x y
# 1: 1 1
Я прошел через [.data.table
исходный код и теперь понимаю, почему это происходит. Подробнее о том, почему это происходит, см. этот пост.
Вкратце, x != 0
оценивается как "логический", а NA
заменяется на FALSE. Тем не менее, !(x==0)
, сначала (x == 0)
оценивается как логическое, а NA
заменяется на FALSE. Затем происходит отрицание, которое приводит к тому, что NA
в основном становится TRUE
.
Итак, мой первый (или, скорее, главный) вопрос заключается в том, что это ошибка/несогласованность? Если это так, я отправлю его как один в data.table R-forge tracker. Если нет, я хотел бы узнать причину этой разницы, и я хотел бы предложить исправление к документации, объясняющей эту разницу (к уже потрясающей документации!).
Изменить: После комментариев с комментариями второй вопрос заключается в том, должна ли data.table
обработка подмножества индексированием с столбцами, содержащими NA
, напоминать значение data.frame
? (Но я согласен, следуя комментарию @Roland, что это может очень хорошо привести к мнениям, и я отлично справляюсь с тем, что не отвечаю на этот вопрос вообще).