2014-02-17 2 views
0

대용량 데이터 집합 (45M 행, 4 개의 int 열)에서 반복적 인 조회를 수행하기 위해 data.table을 사용하고 있습니다.data.table을 사용하여 다중 키 조회를 수행하는 방법은 무엇입니까?

내가 원한다.

library(data.table) 
# generate some data, u's can show up in multiple s's 
d1 <- data.table(u=rep(1:500,2), s=round(runif(1000,1,100),0)) 
setkey(d1, u, s) 

# for each u, I want to lookup all their s's 
us <- d1[J(u=1), "s", with=F] 
# for each of the s's in the above data.table, 
# I want to lookup other u's from the parent data.table d1 

# DOESN'T WORK: 
otherus <- d1[J(s = us), "u", with=F] 

# THIS WORKS but takes a really long time on my large dataset: 
otherus <- merge(d1, us, by='s') 

병합 내 목적으로하지만 내 'D1'이후 작동 >>> '우리', 그것은 시간이 오래 걸립니다. 처음에는 어쩌면베이스에서 병합을 사용하고 있다고 생각했지만 문서를 기반으로하면 data.table처럼 보입니다. 병합은 class (first_arg 병합)가 data.table입니다.

아직 data.table J() 구문에 익숙해 져 있습니다. 이것을 성취하기위한 더 좋은 방법이 있습니까?

미리 감사드립니다.

+0

오히려 그 이름은 혼란 스럽습니다. '우리'가 여러 개의 'u'를 말하는 것이 아니라 여러 개의 's'가 paticular 'u'와 관련이있는 것이 아닌가? 어쨌든, 이것은 저에게 그래프 이론처럼 들립니다. 이웃을 찾는 거지? 그렇다면,'igraph' 패키지를 살펴 보는 것이 좋습니다. 감사합니다. @Georg. – Frank

답변

1

이러한 용도로 키를 변경할 수 있습니다.

setkey(d1,s,u) 

는 명령 후 동일한 값 su 모든 값들은 함께 그룹화된다.

 u s 
    1: 20 1 
    2: 35 1 
    3: 36 1 
    4: 87 1 
    5: 123 1 
    ---   
996: 208 100 
997: 262 100 
998: 352 100 
999: 430 100 
1000: 455 100 

키 열에 의해 정의 된 그룹에서 수행되는 조작은 일반적으로 매우 빠르게 작동합니다. 당신이 두 그룹 us에 대한 빠른 집계를 수행해야하는 경우

d1[,mean(u),keyby='s'] 

, 당신은 data.table의 두 인스턴스를 저장할 수 있습니다. 하나는 setkey(d1,u,s)이고 다른 하나는 setkey(d1,s,u)입니다. u의 값으로 정의 된 그룹에서 신속하게 작업을 수행하려면 이전 데이터를 사용하십시오. 그렇지 않으면 후자를 사용하십시오.

+0

나는 실제로 그것을했습니다 - 기본적으로 서로 다른 키 조합을 가진 data.table의 2 부. 데이터 세트는 크고, 각 작업자를 위해 복사본을 만드는 foreach 루프에서이 작업을 수행해야하므로 RAM이 빠르게 채워집니다. 나는 다른 해결책이 있기를 바랬다. 보고 주셔서 감사합니다. – user3053307

+1

글쎄, 아마도'u'와's'와 두 개의 데이터 테이블에 행 식별자를 더한 인덱스 컬럼 만 저장하는 것이 가능할 것이다. 메모리를 저장하고 공유 메모리에 매트릭스를 저장할 수있는'bigmemory' 패키지와 어떻게 든 결합해라. . – Georg

0

다음과 같이 작동합니까?

d1 <- data.table(u=rep(1:500,2), s=round(runif(1000,1,100),0)) 
setkey(d1, u, s) 
us <- d1[J(u=1), "s", with=F] 
otherus <- merge(d1, us, by='s') 

setkey(d1,s) 
otherus2 <- d1[us] 
identical(otherus2, otherus) 

setkey(d1, u, s) 
관련 문제