为什么 data.table CJ 不尊重列的主要顺序
Why data.table CJ doesn't respect column major order
这与其说是一个问题,不如说是一种好奇,但我想知道为什么 data.table
CJ
函数 returns 具有最右边索引 运行 的对象更快(相反作为基础 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
遵循其他顺序?
像这样对 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"
这与其说是一个问题,不如说是一种好奇,但我想知道为什么 data.table
CJ
函数 returns 具有最右边索引 运行 的对象更快(相反作为基础 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
遵循其他顺序?
像这样对 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"