2015-12-04 14 views
10

data.tableの奇妙な振る舞いに気付きました。data.table NaNを扱う際の "list"対 ":="

は、私はこの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 

さて、私の心には、次の2つの方法が同じ結果を生成する必要がありますが、そうではありません。

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 

あなたが見ることができるように、使用して ":=" とはNaNにリストコマンドの結果に対し8の(C1 = B、C2 = C)の最小値を生成します。NaNも持つ(C1 = B、C2 = b)と(C1 = C、C2 = d)の場合、listコマンドは値を生成します。 これは、与えられたC1 C2の組み合わせの値の前にNaNが最初にある場合にNaNが返されるためです。他の2つの例では、NaNは値の後に来ます。

これはなぜ発生するのですか?

NaNをNAに置き換えると、問題なく値が生成されることに注意してください。

+1

ないアイデアが、 'DT [リスト(AGG =分(.SD $ヴァル、na.rm = TRUE))、=によるC( 'C1'、 'C​​2')]'も動作 – rawr

+1

またはby =。(C1、C2)] 'ちょっと変わったですが、' dplyr'の同等のステップは変換後に動作します'data.frame'に変換します。 – akrun

+1

あなたは間違いなくバグを報告しなければなりません。私はこれが 'data.table''min'関数の"内部的な "実装によるものだと思っています。 'data.table'演算の中では、' min'、 'max'、' sum'のようないくつかの関数はより速い 'data.table'バージョンに置き換えられます。明示的に 'base'関数を呼び出すと正しい出力が得られます:by = c( 'C1'、 'C​​2')' DT [、list(agg = base :: min(Val、na.rm = TRUE) )] '。なぜなら、 ':='と組み合わせて使用​​すると、 'data.table'が' base :: min'に戻ってしまうようなことは考えられません。 – nicola

答えて

7

この問題は、#1461 develで、v1.9.7ではcommit 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 
関連する問題