不等なデータフレームを結合し、欠落している行を 0 に置き換える 質問する

不等なデータフレームを結合し、欠落している行を 0 に置き換える 質問する

2 つの data.frame があり、1 つは文字のみ、もう 1 つは文字と値が含まれています。

df1 = data.frame(x=c('a', 'b', 'c', 'd', 'e'))
df2 = data.frame(x=c('a', 'b', 'c'),y = c(0,1,0))
merge(df1, df2)
  x y
1 a 0
2 b 1
3 c 0 

df1 と df2 をマージします。文字 a、b、c は適切にマージされ、0、1、0 も含まれていますが、d と e には何もありません。0 0 条件で、d と e もマージ テーブルに含めたいです。したがって、df2 データ フレームで欠落している行ごとに、次のように 0 を df1 テーブルに配置する必要があります。

  x y
1 a 0
2 b 1
3 c 0
4 d 0
5 e 0

ベストアンサー1

merge のヘルプ ページをご覧ください。allパラメータを使用すると、さまざまなタイプのマージを指定できます。ここでは を設定しますall = TRUE。これにより、 merge は一致しない値を返すようになりNA、 で 0 に更新できますis.na()

zz <- merge(df1, df2, all = TRUE)
zz[is.na(zz)] <- 0

> zz
  x y
1 a 0
2 b 1
3 c 0
4 d 0
5 e 0

数年後にフォローアップの質問に対応するために更新されました

マージしない 2 番目のデータ テーブル内の変数名を識別する必要があります。私はsetdiff()これを使用します。以下を確認してください。

df1 = data.frame(x=c('a', 'b', 'c', 'd', 'e', NA))
df2 = data.frame(x=c('a', 'b', 'c'),y1 = c(0,1,0), y2 = c(0,1,0))

#merge as before
df3 <- merge(df1, df2, all = TRUE)
#columns in df2 not in df1
unique_df2_names <- setdiff(names(df2), names(df1))
df3[unique_df2_names][is.na(df3[, unique_df2_names])] <- 0 

2019-01-03に作成reprex パッケージ(v0.2.1)

おすすめ記事