2017-03-09 72 views
0

我做一个简单的加盟2个datables如下:山坳加入

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',因此也就是名称。现在的问题是,在另一个例子中,我有许多这些重复的列与'我'之前,因此我想删除它们或更好地排除他们在合并过程中。我知道这应该可以用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),而且,我看它比其他方式要慢。

解决这个问题的最好方法是什么(还有更多列和重复的情况,这只是为了说明问题)?

+0

什么约'DT2 [DT1 [, - “×1”]中,= C(IDX2 = “IDX”)]' – HubertL

+0

好,谢谢,现在与j表达式中的通常列表语法无关。我仍然想知道,如果我想使用列表语法,可以通过这样做来选择除列之外的所有列吗? sthg喜欢'。(Idx2,x1,x2,x3,targetcol)',但更简洁?此外,列的排序与“merge”不同 – user3032689

回答

2

回答从评论移动与来自HubertL代码稍微修改

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