使用另一个data.table子集data.table

时间:2013-12-19 15:43:49

标签: r data.table subset

我有dtdt1 data.table

dt<-data.table(id=c(rep(2, 3), rep(4, 2)), year=c(2005:2007, 2005:2006), event=c(1,0,0,0,1))
dt1<-data.table(id=rep(2, 5), year=c(2005:2009), performance=(1000:1004))

dt

   id year event
1:  2 2005     1
2:  2 2006     0
3:  2 2007     0
4:  4 2005     0
5:  4 2006     1

dt1

   id year performance
1:  2 2005        1000
2:  2 2006        1001
3:  2 2007        1002
4:  2 2008        1003
5:  2 2009        1004

我想使用同样出现在dt1中的第一列和第二列的组合对前者进行子集化。因此,我想创建一个新对象而不覆盖dt。这就是我想要获得的。

   id year event
1:  2 2005     1
2:  2 2006     0
3:  2 2007     0

我尝试使用以下代码执行此操作:

dt.sub<-dt[dt[,c(1:2)] %in% dt1[,c(1:2)],]

但它不起作用。结果,我找回了与dt相同的数据表。我认为我的代码中至少有两个错误。首先,我可能使用错误的方法按列对data.table进行了子集化。第二个,很明显,%in%适用于向量而不适用于多列对象。不可能,我无法找到更有效的方法来做到这一点......

提前感谢您的帮助!

2 个答案:

答案 0 :(得分:8)

setkeyv(dt,c('id','year'))
setkeyv(dt1,c('id','year'))
dt[dt1,nomatch=0]

输出 -

> dt[dt1,nomatch=0]
   id year event performance
1:  2 2005     1        1000
2:  2 2006     0        1001
3:  2 2007     0        1002

答案 1 :(得分:4)

使用merge

merge(dt,dt1, by=c("year","id"))
   year id event performance
1: 2005  2     1        1000
2: 2006  2     0        1001
3: 2007  2     0        1002