2017-02-21 6 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 

Хочу добавить столбец х, у от df1 к df2 при вставке строки, содержащей term А при введении NA для остальной части колонны.

Цель состоит в том, чтобы получить следующее:

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 и term для df2, поэтому вы должны передать эту информацию merge через by.x и by.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' –

Смежные вопросы