2010-02-09 8 views
43

참고 :이 질문과 답변은 data.table 버전을 참조하십시오. < 1.5.3; v. 1.5.3이이 문제를 해결하기 위해 2011 년 2 월에 릴리스되었습니다. 최근 처리 (03-2012)를 참조하십시오 : Translating SQL joins on foreign keys to R data.table syntaxdata.table 병합 작업 수행 방법


을 내가 (특정 작업을 위해 훨씬 더 효율적 data.frame 대체)에 data.table package에 대한 문서를 통해 파고 봤는데, Josh Reich's presentation on SQL and data.table at the NYC R Meetup (PDF 포함), 그러나이 완전히 사소한 조작을 이해할 수는 없다. "[첫 번째 인수는] 자체 data.table 때이 기반이 :: 병합을 유사한 호출에 참여하지만, 정렬 키에 이진 검색을 사용합니다."

> x <- DT(a=1:3, b=2:4, key='a') 
> x 
    a b 
[1,] 1 2 
[2,] 2 3 
[3,] 3 4 
> y <- DT(a=1:3, c=c('a','b','c'), key='a') 
> y 
    a c 
[1,] 1 a 
[2,] 2 b 
[3,] 3 c 
> x[y] 
    a b 
[1,] 1 2 
[2,] 2 3 
[3,] 3 4 
> merge(x,y) 
    a b c 
1 1 2 a 
2 2 3 b 
3 3 4 c 

워드 프로세서 말 분명히 이것은 사실이 아닙니다. data.tables가있는 x [y] 결과에 y에서 다른 열을 가져올 수 있습니까? 키가 y의 키와 일치하지만 x의 나머지 부분은 완전히 무시하는 것처럼 보이는 것 같습니다 ...

+2

CRAN에 2011 년 2 월에 릴리스 된 v1.5.3으로 해결되었습니다. NEWS, new? data.table 및 FAQ를 참조하십시오. –

답변

27

설명서의 잘못된 부분을 인용하고 있습니다. 당신이 [.data.table의 문서를 읽어보십시오 당신이 읽습니다 :

을 나는 data.table 인 경우, X는 일치 X의 행 x와 반환 에 내가 가입 의미하는 키가 있어야합니다. 동등 조인 은 x의 각 열과 x 키의 각 열 사이에서 순서대로 수행됩니다. 이것과

내가 인정하는 n 열의 행렬의 n 차원 배열을 부분 집합 높은 차원 2 열의 행렬 매트릭스 을 서브 세트의 R 기능 기초 비슷 패키지에 대한 설명 (인용 한 부분)은 다소 혼란 스럽습니다. 왜냐하면 "병합 대신에"[ "- 조작을 사용할 수 있다고합니다. 하지만 x와 y가 둘 다 data.tables 인 경우 이진 검색 대신 색인 (병합과 같이 호출 됨)에 조인을 사용합니다.


한 가지 더 :

install.packages 그렇게 merge.data.frame를 부를 것이다 merge를 사용하여 merge.data.table method를 실종됐다 통해 내가 설치 한 data.table 라이브러리입니다. package from R-Forge R을 설치 한 후 더 빠른 merge.data.table 방법을 사용했습니다.

당신이 merge.data.table 방법이있는 경우는 출력 확인하여 확인할 수 있습니다

methods(generic.function="merge") 

EDIT [더 이상 유효 답변] :이 답변 data.table을 말한다 버전 1.3. 버전 1.5.3에서는 data.table의 동작이 변경되고 x [y]는 예상 된 결과를 반환합니다. 의견을 지적 해 주신 data.table의 저자 Matthew Dowle에게 감사드립니다.

+0

Ah. CRAN의 버전이 버전 1.2이고 R-Forge의 버전이 버전 1.3 인 것처럼 보입니다. 'merge' 메쏘드가 1.3에 추가 된 것 같습니다. R-Forge를 둘러 보면서 말할 수있는 것부터 8 개월 전부터 메소드가 추가되었으므로 아직 CRAN에없는 이유를 알 수 없습니다! – Harlan

+5

X [Y] 구문이 2011 년 2 월에 CRAN에 공개 된 v1.5.3에서 변경되었습니다. NEWS, new? data.table 및 FAQ를 참조하십시오. –

3

필자는 f3lix가 정확하고 설명서가 약간 잘못된 것이라고 생각합니다. 데이터의 하위 집합을 빠르게 조인하는 것이 이점입니다.위의 예에서와 같이 궁극적으로 궁극적으로 merge 함수를 사용해야합니다.

Josh's presentation on using data.table에서 그의 예가 어떻게 실행되는지 확인할 수 있습니다. 그는 먼저 데이터 테이블 중 하나를 하위 집합으로 만든 다음 병합을 수행합니다.

library(data.table) 
sdt <- DT(series, key='series_id') 
ddt <- DT(data, key='series_id') 
u <- sdt[ grepl('^[A-Z]{2}URN', fred_id) & !grepl('DSURN', fred_id) ] 
d <- ddt[ u, DT(min=min(value)), by='series_id', mult='all'] 
data <- merge(d,series)[,c('title','min','mean','max')] 
+0

고마워, 셰인. 'merge'가'data.table' 장점을 이용하지 않을 것이라는 것을 알았 기 때문에 나는 이것을 매우 혼란스러워했습니다. – Harlan

14

답변 해 주셔서 감사합니다. 나는 원래 게시되었을 때이 스레드를 놓쳤다. data.table은 2 월 이후로 이전되었습니다. 1.4.1은 얼마 전에 CRAN에 공개되었으며 1.5는 곧 출시 될 예정입니다. 예를 들어 DT() 별칭이 list()로 대체되었습니다. 이제는 기본으로 훨씬 빠르게 data.table이 data.frame에서 상속되므로 만이 gagplot 및 lattice와 같은 data.frame을 수락하는 패키지에서 작동하므로 더 빠르고 더 편리하게 변환 할 필요가 없습니다.

누군가가 해당 태그와 함께 질문을 올렸을 때 전자 메일을받을 수 있도록 data.table 태그에 가입 할 수 있습니까? datatable-help 목록은 한 달에 약 30-40 개의 메시지로 증가했지만, 어떤 종류의 알림을받을 수 있다면 여기에도 답변 해 드리겠습니다.

마태 복음

+1

안녕하세요, 메모 주셔서 감사합니다! 네, 확실히 가능합니다. 화면의 오른쪽 위 모서리에있는 'data.table' 태그 상자를 클릭 한 다음 RSS 아이콘이 보일 때까지 아래로 스크롤하여이 태그를 사용하여 질문에 가입하십시오. – Harlan

+0

감사합니다. Harlan. 나는 지금 구독했다. –

9

내가 data.table이 훨씬 빠를 수 있습니다 조인 사용하는 등, 필요하지 않은 base::merge 기능을 사용하여 생각합니다. 예 : 다음을보십시오. 나는 3-3 열이 xy data.tables합니다

> x <- data.table(foo = 1:5, a=20:24, zoo = 5:1) 
> y <- data.table(foo = 1:5, b=30:34, boo = 10:14) 
> setkey(x, foo) 
> setkey(y, foo) 

그리고 base:merge으로 모두를 병합하고 data.table는 실행의 속도 볼 조인

> system.time(merge(x,y)) 
    user system elapsed 
    0.027 0.000 0.023 
> system.time(x[,list(y,x)]) 
    user system elapsed 
    0.003 0.000 0.006 

결과로, 동일하지를 후자에는 하나의 추가 열이 있습니다.

> merge(x,y) 
    foo a zoo b boo 
[1,] 1 20 5 30 10 
[2,] 2 21 4 31 11 
[3,] 3 22 3 32 12 
[4,] 4 23 2 33 13 
[5,] 5 24 1 34 14 
> x[,list(x,y)] 
    foo a zoo foo.1 b boo 
[1,] 1 20 5  1 30 10 
[2,] 2 21 4  2 31 11 
[3,] 3 22 3  3 32 12 
[4,] 4 23 2  4 33 13 
[5,] 5 24 1  5 34 14 

큰 문제를 만들 수 없었습니다.

+3

감사합니다. 흥미 롭습니다. 하지만 완전히 알지 못하는 구문입니다. 만약 내가 그것을 사용한다면, 나는 아마도 함수 (x, y) x [, list (x, y)] 또는 뭔가를 아마도 그 여분의 키 열을 떨어 뜨리는 함수를 재정의 할 수도 ... – Harlan

+2

나는 적절한 data.table의 조인 구문은 실제로 x [y] 또는 x [y]입니다. 즉 조인은 첫 번째 인덱스를 사용해야합니다. 이것은 병합과 동일한 결과를 제공합니다. x [y]와 y [x]는 동일 할 필요는 없다. 즉, y가 foo에서 x를 나타내지 않는 엔트리를 포함하는 경우. 어쩌면 나는 somehting을 놓쳤다. 그러나 조인은 data.table [비 네트] (http://cran.r-project.org/web/packages/data.table/vignettes/datatable-intro.pdf) – cboettig

+1

위를 보아라. x [, list (x, y)]가 나에게 효과가 없었습니다. 나는 x [, c (x, y)]를 시도해 보았다. 비록 이해가되는지 나는 잘 모르겠다. – bala