Отмечено какое-то странное поведение 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, тогда значения генерируются без проблем.