Подтвердить что ты не робот

Data.table "list" против ": =" при работе с NaN

Отмечено какое-то странное поведение data.table, надеюсь, кто-то, кто понимает data.table лучше, чем я могу объяснить.

Скажем, у меня есть это data.table:

library(data.table)
DT <- data.table(
  C1 = c(rep("A", 4), rep("B",4), rep("C", 4)),
  C2 = c(rep("a", 3), rep("b",3), rep("c",3), rep("d",3)),
  Val = c(1:5, NaN, NaN, 8,9,10,NaN,12))

DT
    C1 C2 Val
 1:  A  a   1
 2:  A  a   2
 3:  A  a   3
 4:  A  b   4
 5:  B  b   5
 6:  B  b NaN
 7:  B  c NaN
 8:  B  c   8
 9:  C  c   9
10:  C  d  10
11:  C  d NaN
12:  C  d  12

Теперь, на мой взгляд, следующие два метода должны генерировать те же результаты, но они этого не делают.

TEST1 <- DT[, agg := min(Val, na.rm = TRUE), by = c('C1', 'C2')]
TEST1 <- data.table(unique(TEST1[, c('C1','C2','agg'), with = FALSE]))

TEST2 <- DT[, list(agg = min(Val, na.rm = TRUE)), by = c('C1', 'C2')]

TEST1
   C1 C2 agg
1:  A  a   1
2:  A  b   4
3:  B  b   5
4:  B  c   8
5:  C  c   9
6:  C  d  10


TEST2
   C1 C2 agg
1:  A  a   1
2:  A  b   4
3:  B  b   5
4:  B  c NaN
5:  C  c   9
6:  C  d  10

Как вы можете видеть, использование ": =" генерирует минимальное значение для (C1 = B, C2 = c) of 8. В то время как команда list приводит к NaN. Как ни странно, для (C1 = B, C2 = b) и (C1 = C, C2 = d), которые также имеют NaN, команда list производит значение. Я считаю, что это происходит потому, что в случае, когда NaN является первым до значения для данной C1 C2-комбинации, результаты NaN. Если в двух других примерах NaN появляется после значения.

Почему это происходит?

Замечу, что если NaN заменяются NA, тогда значения генерируются без проблем.

4b9b3361

Ответ 1

Исправлена ​​эта проблема, # 1461 только сейчас в devel, v1.9.7 с совершить 2080.

require(data.table) # v1.9.7, commit 2080+
DT <- data.table(
     C1 = c(rep("A", 4), rep("B",4), rep("C", 4)),
     C2 = c(rep("a", 3), rep("b",3), rep("c",3), rep("d",3)),
     Val = c(1:5, NaN, NaN, 8,9,10,NaN,12))

DT[, list(agg = min(Val, na.rm = TRUE)), by = c('C1', 'C2')]
#    C1 C2 agg
# 1:  A  a   1
# 2:  A  b   4
# 3:  B  b   5
# 4:  B  c   8
# 5:  C  c   9
# 6:  C  d  10