使用R的data.table时,如何确保merge()和J()操作的列顺序相同?

时间:2016-06-16 17:18:42

标签: r data.table

这是关于在执行连接或合并后如何排序列的更高级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()的联接返回的列顺序相同?

1 个答案:

答案 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;争论的家庭。

因此,确保方法将返回相同的结果:

  1. 在左侧放置相同的data.table(&#34; x&#34; merge的参数)和
  2. 使用merge中的all.y = TRUE参数。
相关问题