2013-12-19 5 views
3

나는 dtdt1data.table을가집니다.다른 data.table을 사용하여 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 

I dt1도 나타나지는 제 1 및 제 2 컬럼의 조합을 이용하여 이전의 서브 세트 싶다. 그 결과, 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%이 다중 열 개체가 아닌 벡터에 적용된다는 것입니다. 그럼에도 불구하고 더 효율적인 방법을 찾지 못했습니다 ...

도움을 주셔서 감사합니다!

답변

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 
+0

많은 감사합니다! 아마도 이것은 매우 큰'data.table'에서 더 빠를 것입니다. – Riccardo

+1

'dt1, list (event), nomatch = 0L]'을 실행하는 것이'performance' 컬럼을 원하지 않는다면, 더 빨리해야한다 ... – Arun

+0

'data.table'는 자체 merge를 제공한다. 메서드를 호출합니다. 나는 속도가 비슷할 것으로 기대한다. – James

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 
+0

OMG, 그것은 을 감사합니다 ... 당신이 그것을 볼 수 없을 정도로 쉽게 때로는 솔루션! – Riccardo

관련 문제