2013-07-13 8 views
0

두 개의 데이터 프레임이 있습니다. 하나는 거대 (2 백만 행 이상)이고 다른 하나는 더 작습니다 (약 300,000 행). 더 작은 데이터 프레임은 더 큰 데이터 프레임의 서브 세트입니다. 유일한 차이점은 더 큰 것은 더 작은 속성에 추가해야하는 추가 속성입니다.2 개의 데이터 프레임을 병합하고 일치하지 않는 행을 삭제합니다.

특히 큰 데이터 프레임의 특성은 (날짜, 시간, 주소, 플래그)이며 작은 데이터 프레임의 특성은 (날짜, 시간, 주소)입니다. 각 행에 대해 더 작은 데이터 프레임에 올바른 대응하는 Flag 값을 가져와야합니다. "병합 된"데이터 프레임의 최종 크기는 큰 데이터 프레임에서 사용하지 않는 행을 삭제하여 내 작은 데이터 프레임과 동일해야합니다.

이 작업을 수행하는 가장 좋은 방법은 무엇입니까?

업데이트 :

new<-merge(data12, data2, by.x = c("Date", "Time", "Address"), 
      by.y=c("Date", "Time", "Address")) 

new<-merge(data12, data2, by = c("Date", "Time", "Address")) 

모두

다음뿐만 아니라 속성의 오른쪽 번호 빈 데이터 프레임 (새)을 반환 : 나는 다음과 병합 기능을 테스트 경고 메시지 :

Warning message:In `[<-.factor`(`*tmp*`, ri, value = c(15640, 15843, 15843, 15161, : invalid factor level, NAs generated 
+1

'기본적으로 merge'이 행만 반환의 성능입니다 DF2하는 rbinom을 추가하고 싶습니다 두 입력에 의해 매치된다. –

+0

병합을 사용하면 반환 된 데이터 프레임의 크기가 더 작은 데이터 프레임과 같을까요? – whistler

+0

글쎄요, 더 큰 것에서 약간의 정보를 얻을 수 있습니다. 왜 합치면 좋을까요? '? merge'를보십시오 –

답변

4
R> df1 = data.frame(a = 1:5, b = rnorm(5)) 
    R> df1 
     a   b 
    1 1 -0.09852819 
    2 2 -0.47658118 
    3 3 -2.14825893 
    4 4 0.82216912 
    5 5 -0.36285430 
    R> df2 = data.frame(a = 1:10000, c = rpois(10000, 6)) 
    R> head(df2) 
     a c 
    1 1 2 
    2 2 4 
    3 3 5 
    4 4 3 
    5 5 3 
    6 6 8 
    R> merge(df1, df2) 
     a   b c 
    1 1 -0.09852819 2 
    2 2 -0.47658118 4 
    3 3 -2.14825893 5 
    4 4 0.82216912 3 
    5 5 -0.36285430 3 
+0

게시 한 간단한 병합 예제를 시도했지만 제 데이터에 나와 같은 질문을 받았습니다. 다시, 반환 된 데이터 프레임은 비어 있습니다. 내 데이터에 어떤 문제가 있는지 알 수는 없지만 지금 병합을 수행하는 방법을 알게되었습니다. 전에 경고 메시지를 본 적이 있습니까? – whistler

+0

신경 쓰지 마세요! 나는 왜 내가 그 오류를 알아 냈는지 알았다. 열 중 하나에 다른 데이터 유형이 있습니다! – whistler

+0

@whistler. 축하해! 나중에 참조 할 수 있도록 참조하십시오. http://stackoverflow.com/questions/5963269/how-to-make-a-great-r-reproducible-example –

3

아마도이 작업을 위해 plyr은보다 직관적 인 패키지입니다. 필요한 것은 SQL 내부 조인입니다. 나는이 접근법이 병합()보다 분명하다고 생각한다.

다음은 크기의 데이터 세트로 join()을 사용하는 방법의 간단한 예입니다.

library(plyr) 

id = c(1:2000000) 
rnormal <- rnorm(id) 
rbinom <- rbinom(2000000, 5,0.5) 


df1 <- data.frame(id, rnormal, rbinom) 
df2 <- data.frame(id = id[1:300000], rnormal = rnormal[1:300000]) 

당신은 여기

joined.df <- join(df1, df2, type = "inner") 

가) (병합 대) (가입

system.time(joined.df <- join(df1, df2, type = "inner")) 
Joining by: id, rnormal 
    user system elapsed 
    22.44 0.53 22.80 
system.time(merged.df <- merge(df1, df2)) 
    user system elapsed 
26.212 0.605 30.201 
관련 문제