2014-11-03 2 views
3

나는 미친 듯이 나를 몰아 붙이고 정말로 도움이 필요한 질문이 있습니다. 당신이 v1 및 v3의 요소가 동일하다는 것을 알 수 있었다으로두 개의 큰 데이터 세트를 병합하는 동안 r에 다른 반복 값을 갖는 새로운 열을 생성하는 방법

D1:  
    v1 v2 V3 
1: a 1 1 
2: b 2 2 
3: c 3 3 
4: d 4 4 
5: d 5 1 
6: b 6 2 
7: a 7 3 
8: c 8 4 
9: a 9 1 
10: d 10 2 
11: b 11 3 
12: a 12 4 

> d2 
    v1 v3 v4 
1: a 3 y 
2: b 2 x 
3: c 1 t 
4: d 4 e 

:

d1<-data.table(v1=c("a","b","c","d","d","b","a","c","a","d","b","a"), 
        v2=(seq(1:12)),V3=rep(1:4,times=3)) 

d2<-data.table(v1=c("a","b","c","d"),v3=c(3,2,1,4),v4=c("y","x","t","e")) 

이 두 데이터 세트를 얻을 것입니다 : 단순화 된 질문은 이것이다.

> 

d3 
    v1 v2 V3 V4 
1: a 1 1 na 
2: b 2 2 x 
3: c 3 3 na 
4: d 4 4 e 
5: d 5 1 na 
6: b 6 2 x 
7: a 7 3 y 
8: c 8 4 na 
9: a 9 1 na 
10: d 10 2 na 
11: b 11 3 na 
12: a 12 4 na 

: 지금은 공동으로 두 지수 v1 및 v3의 일치 (D2)에 V4의 값을 반환 D1에 새 열을 생성하여 설정 데이터를 모두 원하는, 나는이처럼 보이는 출력을 얻을 수있는 희망 내가 사용하고있는 실제 데이터의 크기는 상대적으로 매우 큽니다. 23MB의 공동 113MB 데이터와 같은 것입니다. 데이터가 너무 길어서 작업을 완료하는 데 오래 걸리기 때문에 for 루프를 사용하여이 문제를 해결하려고했습니다. 또한 mergesqldf을 시도했지만 둘 다 작업을 완료하지 못했습니다. 이 문제로 나를 도울 수 있습니까? 고마워요!

+0

sqldf가 너무 오래 걸린 이유는 조인 열에 인덱스를 넣지 않았기 때문일 수 있습니다.홈 페이지에는 예제가 있으며 예제가있는 SO에 대한 많은 질문이 있습니다. –

+0

설명해 주셔서 감사합니다. – sxgn

답변

6

나는 이런 식으로 할 거라고 :

setkey(d1, v1, V3) 
d1[d2, v4 := v4][] 
  • 을 A, 형태 x[i]의 조인 키를 들어 x 필요가 설정해야합니다. i 키 집합이 있거나 없을 수 있습니다. 그래서 d1의 키를 v1V3 열로 설정했습니다.

  • 다음으로 d2의 각 행에 대해 d1의 키 열과 일치하는 행을 찾고 조인 결과를 반환하는 조인 d1[d2]을 수행합니다. 우리는 그 결과를 정확히 찾고 있지 않습니다. 각 일치하는 행의 값이 d2v4이고 그렇지 않으면 NA 인 새 열을 추가하고 싶습니다. 이를 위해 참조 기능으로 data.table의 하위 할당을 사용합니다. ix에 합류하는 중에도 j에 표현식을 제공 할 수 있으며 i의 열을 참조 할 수 있습니다. i.v4 (보통 xi에 동일한 이름의 열이있는 경우에 사용됨)이라고도 볼 수 있습니다.

  • := 참조로 열을 추가/업데이트합니다. :=의 LHS는 여기에서 만들려는 열 이름이고 RHS v4은 할당하려는 값입니다 (여기에서 d2의 열임). 그러므로 일치하는 각 행에 대해 d2v4d1의 새 열 (우리는 이름) v4에 참조로 (in-place, 사본이 없음을 의미) 할당하고 일치가없는 행은 기본값을 갖습니다. NA.

  • 마지막 []은 결과를 화면에 출력하는 것입니다. :=은 결과를 눈에 보이지 않게 반환합니다.

여기가 무슨 일이 일어나는지 이해하는 데 도움이되기를 바랍니다.

+0

+1. – akrun

+0

자세한 설명을 해주셔서 감사 드리며 잘 작동합니다. 다시 한 번 감사드립니다! – sxgn

관련 문제