2013-04-05 3 views
3

한다고 가정 내가있어 다음과 같은 두 가지 데이터 테이블 :가입 및 그룹화 두 개의 데이터 테이블

dt1 <- data.table(id=1:3,val1=c("a","a","b"),key="id") 
# id val1 
# 1: 1 a 
# 2: 2 a 
# 3: 3 b 


dt2 <- data.table(id=c(1:3,1:2),val2=10:14,key="id") 
# id val2 
# 1: 1 10 
# 2: 1 13 
# 3: 2 11 
# 4: 2 14 
# 5: 3 12 

이의이 dt1id에 의해 확인 된 사람들의 목록입니다 가정 해 봅시다, 그리고 dt2이 같은에서 관찰 목록 특파원 id과 함께합니다.

이제 val1의 각 그룹에 대해 val2의 평균을 계산하고 싶습니다. 나는 그에게 다음과 같은 방법을 수행 할 수 있음을 이해했습니다

dt1[dt2][,mean(val2),by=val1] 
# val1 V1 
# 1: a 12 
# 2: b 12 

그러나 나는 또한 자주 묻는 질문은 (적어도 매우 큰 데이터 테이블) 효율적인 아니에요 (섹션 1.14)에 읽었습니다.

그럼 더 효율적이고 효과적인 방법이 있습니까?

편집 : 또 다른 관련 질문 :

dt1[dt2][,mean(val2),by=val1] 
dt2[dt1][,mean(val2),by=val1] 

가 동일 또는 둘 사이에 차이가 : 난 그냥 다음 두 줄은 같은 결과를 줄 것이다 것을 보았다?

+0

변형 패키지가 도움이 될 것으로 판단됩니다 (아직 구체적인 해결책은 없지만). 두 데이터 세트를 긴 형식으로 변환하고, 이들을 결합하고 다시 변환하십시오. – kasterma

답변

5

귀하의 경우에는 그렇게 할 수 있습니다. 문서가 설명 무엇, iiuc, (당신은 모든 열에 집계/그룹화되지 않은 경우)이 시나리오의 예를 들면 다음과 같습니다

dt1 <- data.table(id=1:3,val1=c("a","a","b"),key="id") 
dt2 <- data.table(id=c(1:3,1:2),val2=10:14,key="id") 

dt2[, val3 := rep(5:7, c(2,1,2))] 
# id val2 val3 
# 1: 1 10 5 
# 2: 1 13 5 
# 3: 2 11 6 
# 4: 2 14 7 
# 5: 3 12 7 

지금, 당신은 모든 val1 혼자 val2의 평균을 취득한다고 가정 그러면 모든 컬럼을 결합 할 필요가 없습니다. 이 경우, 당신은 할 수 있습니다 :

dt1[dt2, list(val1, val2)][, mean(val2), by=val1] 
# val1 V1 
# 1: a 12 
# 2: b 12 

을 대신하고의 :

# gives same result but performs join on all columns 
dt1[dt2][, mean(val2), by=val1] 

을 두 번째 질문에 대해, 나는 그것이 차이 dt1[dt2]dt2[dt1]을 이해하는 것이 중요합니다 같아요. 이를 위해 귀하의 데이터가 최선의 예가 아닙니다.

dt1[dt2] 
# id val1 val2 
# 1: 1 a 6 
# 2: 2 NA 5 
# 3: 3 NA 3 
# 4: 6 NA 4 
# 5: 7 NA 2 
# 6: 8 NA 1 

dt2[dt1]dt1의 모든 id 걸리는

대응 :

dt1 <- data.table(id=c(1,4,5), val1=c("a","a","b")) 
dt2 <- data.table(id=c(1,2,3,6,7,8), val2=c(6,5,3,4,2,1)) 

setkey(dt1, "id") 
setkey(dt2, "id") 

dt1[dt2] 조인 수행 dt2의 모든 id 위해 취해 dt1 모든 다른 컬럼의 대응하는 값을 가져,한다고 가정 다른 열의 값이 dt2 인 경우 조인을 수행하십시오.

dt2[dt1] 
# id val2 val1 
# 1: 1 6 a 
# 2: 4 NA a 
# 3: 5 NA b 

dt1[dt2]의 값은 의 ID가 dt2 인 것을 유의하십시오. 마찬가지로 dt2[dt1]에는 dt1에있는 문자 만 포함됩니다. 귀하의 경우, id은 정확히 동일하므로 (발생 횟수를 무시함) 두 조인 모두 동일한 조인 (열 순서 제외), iiuc를 제공합니다.당신이이 "전체"에 가입 all=TRUEmerge를 사용하려는 경우


다만,이 부분이 완료 확인합니다. merge.data.table 메서드가 구현되었습니다.

merge(dt1, dt2, all = TRUE) 

merge(dt1, dt2, all.x = TRUE) 
# is equivalent to 
dt2[dt1] 

merge(dt1, dt2, all.y = TRUE) 
# is equivalent to 
dt1[dt2] 
+0

답장을 보내 주셔서 감사합니다. 나는 처음 질문 할 것임을 알았습니다. ^^ 내 질문 텍스트에 두 번째 관련 질문을 추가했습니다. 시간이 있다면 ... – juba

+1

그건 분명 해요. 몇 가지 upvotes ... 너무 명확하게 답변 시간을내어 주셔서 감사합니다. 이제는 두 경우 모두'.N '의 다른 값을 이해해야합니다. 그러나 그것은 또 다른 질문입니다. – juba

+0

질문 2의 대답에 대한 이전 설명에 오류가있었습니다. 다시 읽어야 할 수도 있습니다. 미안합니다. – Arun