这是一个更高级别的 data.table
问题,关于在执行连接或合并后如何对列进行排序。现在,解决这些问题很容易,但我试图理解为什么会发生这种情况并更好地了解 data.table
。
这是一个最小的例子。
library(data.table)
set.seed(123)
dt_example1 <- data.table(C1 = c(1,2,3,5,6,7),
C2 = c("A","A","B","C","A","A"))
dt_example2 <- data.table(C1 = 1:10,
C3 = sample(x = LETTERS,size = 10,replace = T))
setkey(dt_example1,
C1)
setkey(dt_example2,
C1)
dt_example2[J(dt_example1)]
C1 C3 C2
1: 1 H A
2: 2 U A
3: 3 K B
4: 5 Y C
5: 6 B A
6: 7 N A
merge(x = dt_example1,
y = dt_example2,
all.x = TRUE)
C1 C2 C3
1: 1 A H
2: 2 A U
3: 3 B K
4: 5 C Y
5: 6 A B
6: 7 A N
我从 example provided here 中提取,它指出
Y[X]
等效于 merge(x = X,y = Y,all.x = TRUE)
(即左外连接)。执行它们时,为两个查询返回相同的数据。但是,列的顺序是不同的。我知道 answer posted here 解释了
merge()
如何在两个方向上执行连接。我的问题是为什么列顺序会不同,以及如何确保列顺序相同,但该问题没有解决。我可以从概念上理解,在执行
Y[X]
时, Y
中的非关键列可能首先出现(因为它毕竟是 Y
后跟 [X]
)。同样,使用 merge()
,我可以看到函数如何重新排序输出以确保变量按“按变量、x 变量、y 变量”的顺序出现。为什么这两种方法的列顺序不同?有什么方法可以确保
merge()
返回的列顺序和使用 J()
的连接返回的列顺序相同吗? 最佳答案
请注意,反转合并顺序并使用 all.y=TRUE 而不是 all.x=TRUE 以确保将保留相同的行,结果左连接具有完全相同的列顺序:
merge(x = dt_example2, y = dt_example1, all.y = TRUE, by="C1")
C1 C3 C2
1: 1 H A
2: 2 U A
3: 3 K B
4: 5 Y C
5: 6 B A
6: 7 N A
我查看列排序的方式是,左侧的 data.table 作为“基础”,使用右侧的 data.table 添加其他列。这适用于 join 和 merge 方法。
在行选择方面,右侧data.table 上的data.table 用于在join 方法中对左侧“基本”data.table 的行进行子集化。在合并方法中,此行子集由“所有”参数族确定。
因此,请确保这些方法将返回相同的结果:
merge
的“x”参数)和 merge
中使用 all.y=TRUE 参数。 关于r - 使用 R 的 data.table 时,如何确保合并 () 和 J() 操作的列顺序相同?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/37865602/