2011-12-22 18 views
8

2つのデータフレームにそれぞれ異なる列数があります。いくつかの列は、2つのデータフレームの間で共通です。 2つのデータフレームの共通の列のみを新しいデータフレームにどのようにバインドできますか?2つのデータセットの共通列のみをバインドする方法

私はlibrary(plyr);rbind.fill(A,B)で試しましたが、一致しない列にNA値を設定しています。これは私には役に立ちません。

どうもありがとう EC

答えて

23

は、共通の列を取得するにはintersectを使用してください。

コメントで指摘したように
dfr1 <- data.frame(x = 1:5, y = runif(5), z = rnorm(5)) 
dfr2 <- data.frame(w = letter[1:5], x = 6:10, y = runif(5)) 
common_cols <- intersect(colnames(dfr1), colnames(dfr2)) 
rbind(
    subset(dfr1, select = common_cols), 
    subset(dfr2, select = common_cols) 
) 

は、あなたは小さなパフォーマンスとタイピング改善のため

rbind(
    dfr1[, common_cols], 
    dfr2[, common_cols] 
) 

と最後の行を置き換えることができます。

rbind(
    dfr1[common_cols], 
    dfr2[common_cols] 
) 

でも動作しますが、少しはっきりしないと思います。ここで

+0

交差のニースの使用あなたの質問を得た願っています! +1 – ECII

+0

非常に簡潔で分かりやすい。 +1 –

+2

ここではサブセットを使用する必要はありません。一般的に、非標準評価を使用する関数ではプログラミングを避けたいと考えています。なぜなら 'dfr1 [common_cols]'と比べてかなり冗長であるからです。 – hadley

2

私の解決策である私は右

df1 <- data.frame(a=rnorm(100), b=rnorm(100), not=rnorm(100)) 
df2 <- data.frame(a=rnorm(100), b=rnorm(100)) 

bind1 <- bind1 <- df1[, names(df1) %in% names(df2)] 
bind2 <- bind1 <- df1[, names(df2) %in% names(df1)] 

rbind(bind1, bind2) 
+0

'df2'に' df1'以外の列があるとどうなりますか? –

+0

また、 'subset'の呼び出しは必要ありません。後で索引付けを使用する場合は、%names(df2)の 'names(df1)% 'によって作成された論理ベクトルを渡すことができます。 –

+0

あなたの最初のコメントについて:df2にdf1にない列がある場合 - それらは一般的ではなく、フィルタリングしたくない - あるいは間違っていますか?あなたの2番目のコメントについて:右これはおそらく私はそれがちょっとやっかすぎたかもしれません... – Seb

関連する問題