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)