这是一个更高级别的 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 的行进行子集化。在合并方法中,此行子集由“所有”参数族确定。

因此,请确保这些方法将返回相同的结果:
  • 将相同的 data.table 放在左侧(merge 的“x”参数)和
  • merge 中使用 all.y=TRUE 参数。
  • 关于r - 使用 R 的 data.table 时,如何确保合并 () 和 J() 操作的列顺序相同?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/37865602/

    10-11 23:27
    查看更多