这是关于在执行连接或合并后如何排序列的更高级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()
,我可以看到函数如何重新排序输出以确保变量以“by variable,x variables,y variables”的顺序出现。
为什么这两种方法的列顺序不同?有没有办法确保merge()
和使用J()
的联接返回的列顺序相同?
答案 0 :(得分:4)
请注意,颠倒合并的顺序并使用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充当&#34; base&#34;使用右侧的data.table向其添加其他列。这适用于连接和合并方法。
在行选择方面,右侧data.table上的data.table用于对&#34; base&#34;的行进行子集化。 join方法左侧的data.table。在合并方法中,此行子集化由&#34; all&#34;争论的家庭。
因此,确保方法将返回相同的结果:
merge
的参数)和merge
中的all.y = TRUE参数。