문제

메모:이 질문과 다음 답변은 data.table 버전 < 1.5.3을 나타냅니다.V.1.5.3은 이 문제를 해결하기 위해 2011년 2월에 출시되었습니다. 최신 치료법(03-2012)을 참조하세요. 외래 키의 SQL 조인을 R data.table 구문으로 변환


관련 문서를 뒤져봤습니다 데이터.테이블 패키지 (특정 작업에 훨씬 더 효율적인 data.frame 대체) NYC R Meetup에서 SQL 및 data.table에 대한 Josh Reich의 프레젠테이션 (pdf), 하지만 이 완전히 사소한 작업을 알아낼 수는 없습니다.

> 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

문서는 [첫 번째 인수] 자체가 데이터 일 때, 기반 :: merge와 유사하게 조인이 호출되지만 정렬 된 키에서 이진 검색을 사용합니다."라고 말합니다. 분명히 이것은 사실이 아닙니다.data.tables를 사용하여 y의 다른 열을 x[y]의 결과로 가져올 수 있나요?키가 y의 키와 일치하는 x의 행을 취하고 나머지 y를 완전히 무시하는 것처럼 보입니다.

도움이 되었습니까?

해결책

문서의 잘못된 부분을 인용하고 있습니다.의 문서를 보면 [.data.table 당신은 읽을 것입니다 :

내가 data.table이면 x는 키가 있어야합니다. 일치하는 X에서 행을 반환하십시오.I의 각 열 사이에서 X의 키의 각 열에서 순서대로 등장합니다.이것은 2 열 행렬에 의해 행렬을 하위 설정의 기본 R 기능과 유사하며, N-Column 매트릭스에 의해 n- 차원 배열을 서브 셋팅하는 더 높은 치수에서

패키지 설명(인용하신 부분)이 다소 혼란스럽다는 점을 인정합니다. 병합 대신 "[" 작업을 사용할 수 있다고 말하는 것 같기 때문입니다.하지만 내 생각에 그 내용은 다음과 같다.x와 y가 모두 data.tables이면 이진 검색 대신 인덱스에 대한 조인(병합처럼 호출됨)을 사용합니다.


하나 더:

내가 설치한 data.table 라이브러리 install.packages 을 놓치고 있었다 merge.data.table method, 그래서 사용 merge 전화할 것이다 merge.data.frame.설치 후 R-Forge의 패키지 R이 더 빠르게 사용됨 merge.data.table 방법.

다음 출력을 확인하여 merge.data.table 메소드가 있는지 확인할 수 있습니다.

methods(generic.function="merge")

편집 [답변이 더 이상 유효하지 않음]: 이 답변은 data.table 버전 1.3을 나타냅니다.버전 1.5.3에서는 data.table의 동작이 변경되었으며 x[y]는 예상된 결과를 반환합니다.감사합니다 매튜 다울, data.table의 저자인 , 댓글에서 이 점을 지적해 주셨습니다.

다른 팁

답변 주셔서 감사합니다. 이 스레드가 원래 게시되었을 때이 스레드를 놓쳤습니다. Data.table은 2 월부터 계속 진행되었습니다. 1.4.1은 얼마 전에 Cran에게 풀려 났고 1.5가 곧 출시되었습니다. 예를 들어 dt () 별칭이 list ()로 대체되었습니다. 원시적으로 훨씬 빠르고 data.table은 이제 data.frame에서 상속되어 패키지와 함께 작동합니다. 변환이 필요없이 GGPlot 및 격자와 같은 데이터를 수락하십시오 (더 빠르고 편리합니다).

누군가가 해당 태그로 질문을 게시 할 때 이메일을 받도록 Data.table 태그를 구독 할 수 있습니까? DataTable-Help 목록은 한 달에 약 30-40 개의 메시지로 성장했지만, 어떤 종류의 알림을받을 수 있다면 여기에서도 기꺼이 답변 해 드리겠습니다.

매튜

나는 사용한다고 생각한다 base::merge 사용하면 기능이 필요하지 않습니다 data.table 결합은 훨씬 더 빠를 수 있습니다. 예를 들어 다음을 참조하십시오. 나는 만든다 x 그리고 y 3-3 열이있는 데이터.

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

큰 문제를 일으킬 수 없었습니다 :)

나는 f3lix가 정확하고 문서가 약간 오해의 소지가 있다고 생각합니다.데이터를 부분 집합으로 나누기 위해 빠른 조인을 수행한다는 이점이 있습니다.여전히 궁극적으로 merge 위의 예에서와 같이 나중에 작동합니다.

당신은 볼 것이다 data.table 사용에 대한 Josh의 프레젠테이션 이것이 그의 모범이 실행되는 방식입니다.그는 먼저 data.tables 중 하나를 부분 집합으로 만든 다음 병합을 수행합니다.

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')]
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top