【发布时间】:2018-01-09 02:06:15
【问题描述】:
我有两个数据表,我想根据两列中的值合并/连接,这两个列中的值可以在两个数据表中以相反的顺序出现。 以下是两个示例数据表:
library(data.table)
# df1
col1 <- c("aa", "bb", "cc", "dd")
col2 <- c("bb", "zz", "dd", "ff")
x <- c(130, 29, 122, 85)
dt1 <- data.table(col1, col2, x)
col1 col2 x
1: aa bb 130
2: bb zz 29
3: cc dd 122
4: dd ff 85
# df2
col1 <- c("zz", "bb", "cc", "ff")
col2 <- c("bb", "aa", "dd", "dd")
y <- c(34, 567, 56, 101)
dt2 <- data.table(col1, col2, y)
col1 col2 y
1: zz bb 34
2: bb aa 567
3: cc dd 56
4: ff dd 101
所以 col1 和 col2 中的值在两个数据表中是相同的,但分布不同。例如。 aa 在 dt1 的 col1 中,但在 dt2 的 col2 中。 我想基于 col1 和 col2 对合并/加入数据表,但它们在另一个数据表中可能是相反的顺序。 (请注意,简单地对它们进行排序是行不通的。)
这意味着合并/连接等必须能够“看到” dt1 中的 aa+bb 对作为 dt2 中的 bb+aa 出现并分配 dt2 的正确值,即所需的输出是:
col1 col2 x y
1: aa bb 130 567
2: bb zz 29 34
3: cc dd 122 56
4: dd ff 85 101
或者这个(即保留 dt1 或 dt2 的顺序无关紧要):
col1 col2 x y
1: zz bb 29 34
2: bb aa 130 567
3: cc dd 122 56
4: ff dd 85 101
我的原始数据表大约有。 300 万行(是的,它们很大),所以手动做任何事情都是不可能的。 我在这里环顾四周,但找不到任何适用于我的案例的解决方案。有谁知道怎么做?
非常感谢任何提示!
【问题讨论】:
-
dt2[col1 > col2, c("col1", "col2") := .(col2, col1)]; dt1[dt2, on=.(col1, col2)]有效。或者您可以按照 sirallen 的建议使用:=将该列添加到dt1。 -
@Frank,这行得通!非常感谢!您是否想将其发布为答案?
-
Np,很高兴它有效 :) 随意用它或类似的东西编辑你的答案。
标签: r join merge data.table