数据表连接中的重复col

问题描述 投票:0回答:2

我做了两个数据表的简单连接,如下所示:

set.seed(1)
DT1 <- data.table(
Idx = rep(1:100),  
x1 = round(rnorm(100,0.75,0.3),2),
x2 = round(rnorm(100,0.75,0.3),2),
x3 = round(rnorm(100,0.75,0.3),2))

DT2 <- data.table(
Idx2 = rep(1:100),
x1 = round(rep(pi,100),2),
targetcol = rep(999,100))

DT2[DT1,on = c(Idx2 = "Idx")]

这有效,但结果中有一列i.x1,我不想要。我只想包括'targetcol',因此得名。现在的问题是,在另一个例子中,我有很多这些重复的列,前面有'i',因此我想删除它们或者在合并期间更好地排除它们。我知道这应该是可能的X[Y,.(...)],但我没有找到正确的方法如何填补.(...)中的所有点,除了一列,即除了i.x1。所以我想知道使用list-syntax选择数据表中多列的最佳方法是什么?

其次,我尝试了更新的datatable合并语法:

merge(x = DT1, y = DT2[,c("Idx2","targetcol")], by.x = "Idx",by.y = "Idx2", all.x=TRUE)

但它导致了不同的列排序,命名(x1.xx1.y),而且,我读它比其他方式慢。

解决此问题的最佳方法是什么(如果有更多列和重复项,这也只是为了说明问题)?

r data.table
2个回答
2
投票

从HubertL代码稍作修改的评论中移除了答案

DT1[DT2[, .(Idx2, targetcol)], on = c(Idx = "Idx2")]

0
投票

不是data.table解决方案,但可能仍然相关。

使用我的包safejoin,您有几种选择。

# devtools::install_github("moodymudskipper/safejoin")
library(safejoin)

(1)eat明确你想要的列:

eat(DT1, DT2, targetcol, .by = c(Idx = "Idx2"))

(2)遵循您想要的模式的eat列:

eat(DT1, DT2, starts_with("target"), .by = c(Idx = "Idx2"))

(3)eat all(或使用safe_left_join)但如果发生冲突,请保留第一栏:

eat(DT1, DT2, .by = c(Idx = "Idx2"), .conflict = ~.x)
safe_left_join(DT1, DT2, by = c(Idx = "Idx2"), conflict = ~.x) # same thing here

它们都给出以下输出:

#   Idx   x1   x2   x3 targetcol
# 1   1 0.56 0.50 1.20       999
# 2   2 0.81 0.90 0.87       999
# 3   3 0.50 0.97 0.56       999
# 4   4 1.23 0.92 0.09       999
# 5   5 0.85 0.66 1.09       999
© www.soinside.com 2019 - 2024. All rights reserved.