我有dt
和dt1
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%
适用于向量而不适用于多列对象。不可能,我无法找到更有效的方法来做到这一点......
提前感谢您的帮助!
答案 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