这是我在data.table 1.8.11(r1101,2014-01-28)中发现的一些有趣的行为。 by子句中包含的变量的顺序会更改聚合的结果:
> foo = data.table(a=rep(c(0,1,0,1),2), b=rep(c(T,T,F,F),2), c=c(1,1,1,1,1,1,1,1))
> foo
a b c
1: 0 TRUE 1
2: 1 TRUE 1
3: 0 FALSE 1
4: 1 FALSE 1
5: 0 TRUE 1
6: 1 TRUE 1
7: 0 FALSE 1
8: 1 FALSE 1
> foo[, .N, by=list(b, a)]
b a N
1: TRUE 0 1
2: TRUE 1 1
3: FALSE 0 1
4: FALSE 1 1
5: TRUE 0 1
6: TRUE 1 1
7: FALSE 0 1
8: FALSE 1 1
> foo[, .N, by=list(a, b)]
a b N
1: 0 TRUE 2
2: 1 TRUE 2
3: 0 FALSE 2
4: 1 FALSE 2
>
在data.table(1.8.10)的稳定版本中不会发生这种情况。
答案 0 :(得分:4)
o修复了由于最近对fastorder的修复而产生的错误,其中聚合逻辑类型有时会导致错误的结果。关闭#5307。感谢Clayton Stanley报告SO:data.table 1.8.11 and aggregation issues
require(data.table) # commit 1103 v1.8.11
foo[, .N, by=list(b,a)]
b a N
1: TRUE 0 2
2: TRUE 1 2
3: FALSE 0 2
4: FALSE 1 2
foo[, .N, by=list(a,b)]
a b N
1: 0 TRUE 2
2: 1 TRUE 2
3: 0 FALSE 2
4: 1 FALSE 2