2013-04-16 79 views
7

如果我理解正确,默认情况下,data.table通过比较设置为键和具有相同名称的列来合并两个表。如果我有具有不同列名称的表,应该如何编写?例如:具有不同列名称的合并表

set.seed(123) 
DT1<-data.table(col1=sample(letters,5,replace=TRUE),col2=sample(LETTERS[1:5],5,replace=TRUE),col3=sample(1:2,5,replace=TRUE)) 
DT2<-data.table(col4=sample(1:3,10,replace=TRUE),col5=sample(LETTERS[1:5],10,replace=TRUE),col6=sample(1:100,10,replace=TRUE)) 
(DT1) 
(DT2) 

> (DT1) 
    col1 col2 col3 
1: h A 2 
2: u C 1 
3: k E 2 
4: w C 2 
5: y C 1 
> (DT2) 
    col4 col5 col6 
1: 3 D 48 
2: 1 C 76 
3: 1 C 22 
4: 1 B 32 
5: 3 A 24 
6: 3 E 15 
7: 3 E 42 
8: 2 D 42 
9: 3 D 37 
10: 2 A 16 

我应该在DT1[写尽合并选择具有COL2 == COL5 & COL3 == COL4只行? 这是一个预期的输出:提前

col1 col2 col3 col4 col5 col6 
    h A 2 2 A 16 
    u C 1 1 C 76 
    u C 1 1 C 22 
    y C 1 1 C 76 
    y C 1 1 C 22 

谢谢!

+0

您能告诉我们您期待的输出吗? – Arun

+0

当然,只需一秒钟 –

+0

我会补充说,当你没有谨慎地指定密钥时,想要弄明白为什么'data.table'在“错误”列上合并,这是一个很好的问题。 – MichaelChirico

回答

21

使用基于data.table的子集与最近实施on=参数和nomatch=0L加入一起,这简直是:

DT2[DT1, on=c(col5="col2", col4="col3"), nomatch=0L] 

secondary indices小插曲更多。


另外,如果你的data.tables键,那么你可以跳过on=说法。但是上面的解决方案会保持原始data.tables的顺序,并且通过查看代码可以清楚地看到正在查找哪些列。

setkey(DT1, col2, col3) 
setkey(DT2, col5, col4) 
DT2[DT1, nomatch=0L] 

查看旧版本的历史记录。

+0

太棒了!我不知道'setkey'功能的这些细节。非常感谢你! –

相关问题