2017-02-21 11 views
1

두 데이터 프레임에 두 개의 공통 프레임이있는 두 개의 데이터 프레임이 있습니다. 데이터 프레임 중 하나에 여분의 행이 있습니다.데이터 프레임 중 하나에 여분의 행이 들어있는 두 개의 data.frames를 병합합니다.

> df1 
       type  x   y 
1     A  10   417 
2     B  2   575 
3     C  3   14 
4     D  944   205 
5     E  44   87 
6     F  355   883 
7     G  73   150 

> df2  
    X1 X2 X3 X4 X5 X6 term 
1 9 28 3 34 5 39 B 
2 43 7 39 41 46 32 C 
3 17 30 0 27 0 9 D 
4 42 32 1 10 26 49 E 
5 21 17 34 28 35 12 F 
6 16 10 18 25 2 0 G 

난 열의 나머지 NA를 도입하면서 term 함유 행을 삽입하는 동안 DF2 DF1에서 열 X, Y를 추가 할.

목표는 다음 얻는 것입니다 :

X1 X2 X3 X4 X5 X6 x y term 
    NA NA NA NA NA NA 10 417 A 
    9 28 3 34 5 39 2 575 B 
    43 7 39 41 46 32 3 14 C 
    17 30 0 27 0 9 944 205 D 
    42 32 1 10 26 49 44 87 E 
    21 17 34 28 35 12 355 883 F 
    16 10 18 25 2 0 73 150 G 

내가 term으로 일반적인 열을 사용하여 병합 기능을 시도하지만 난 솔루션

cbindPad <- function(...){ 
    args <- list(...) 
    n <- sapply(args,nrow) 
    mx <- max(n) 
    pad <- function(x, mx){ 
    if (nrow(x) < mx){ 
     nms <- colnames(x) 
     padTemp <- matrix(NA, mx - nrow(x), ncol(x)) 
     colnames(padTemp) <- nms 
     if (ncol(x)==0) { 
     return(padTemp) 
     } else { 
     return(rbind(x,padTemp)) 
     } 
    } 
    else{ 
     return(x) 
    } 
    } 
    rs <- lapply(args,pad,mx) 
    return(do.call(cbind,rs)) 
} 

을 발견 한 후 작동하지 않았다 그러나 이것은하지 않았다 어느 쪽이든 일하십시오.

답변

1

merge을 사용하십시오. 일반적인 열의 이름은 type이고 df1 일 경우 일 경우 df2이므로이 정보를 함수에 by.xby.y 인수로 전달해야합니다. all=TRUE도 설정하십시오.

> merge(df1, df2, by.x="type", by.y="term", all=TRUE) 
    type x y X1 X2 X3 X4 X5 X6 
1 A 10 417 NA NA NA NA NA NA 
2 B 2 575 9 28 3 34 5 39 
3 C 3 14 43 7 39 41 46 32 
4 D 944 205 17 30 0 27 0 9 
5 E 44 87 42 32 1 10 26 49 
6 F 355 883 21 17 34 28 35 12 
7 G 73 150 16 10 18 25 2 0 
+0

죄송합니다. 실제로 동일한 열 이름을 유지하도록 이름을 바꿉니다. by.x = "type", by.y = "type" '을 사용할 수 있다고 생각합니다. 대답으로 받아 들일 때까지 기다려야합니다 :) –

+1

@ Null-Hypothesis, 공통 열이 같은 이름을 가질 때'by = type'을 사용하고'by.x = type'과'by.y = type'을 제거 할 수 있습니다. '? merge'를보세요. –