为什么data.table CJ不尊重列主要订单

时间:2015-02-01 22:44:07

标签: r data.table

这是一个好奇心而不是一个问题,但我想知道为什么data.table CJ函数返回一个对象,其中最右边的索引运行得更快(与基本expand.grid函数相反)。

一个例子:

CJ(a=letters[1:2],b=LETTERS[1:2])
#   a b
#1: a A
#2: a B
#3: b A
#4: b B
expand.grid(a=letters[1:2],b=LETTERS[1:2])
#  a b
#1 a A
#2 b A
#3 a B
#4 b B

我认为最左边的索引运行速度更快R-ish。 CJ是否有理由遵循其他订单?

1 个答案:

答案 0 :(得分:2)

CJ的结果排序为方便,因为它可以被所有列键入,然后启用这样的操作:

dt = data.table(a = c(1,2,1), b = 1:3, c = c('a', 'a', 'b'))
setkey(dt, a, c)
#   a b c
#1: 1 1 a
#2: 1 3 b
#3: 2 2 a

dt[CJ(unique(a), unique(c))]
#   a  b c
#1: 1  1 a
#2: 1  3 b
#3: 2  2 a
#4: 2 NA b

# just checking the key:
key(dt[, CJ(unique(a), unique(c))])
#[1] "V1" "V2"