2016-04-05 11 views
0

データフレーム(df1 $)の列の値を別のデータフレーム(df2 $ y)の値に条件付きで置きたいと思います。これらのデータフレームには、共有ID列(x)があります。 df1はdf2より多くの行を持ち、df2にない値を持ちます。データフレーム内の値を条件付きでR内の別のデータフレームから置換する

条件は次のとおりです。DF1 $ X == DF2 $ xにあれば、一致しない場合、DF2の$ yを持つDF1の$ yを置き換える何もしない

例:

> df1 <- data.frame(x = c(1, 1, 2, 3, 4, 4, 4, 5, 6, 7), 
        y = c(100, 100, 50, 50, 75, 75, 75, 50, 100, 25)) 
> df1 
    x y 
1 1 100 
2 1 100 
3 2 50 
4 3 50 
5 4 75 
6 4 75 
7 4 75 
8 5 50 
9 6 100 
10 7 25 

> df2 <- data.frame(x = c(2, 4, 6, 7), y = c(25, 100, 75, 100)) 
> df2 
    x y 
1 2 25 
2 4 100 
3 6 75 
4 7 100 

所望の出力次のとおりです。

これは私の最初の質問です。これは別の質問で回答されている場合は、私にごめんなさい。

この質問は、条件付きでdf1 $ yの値を置き換える方法を尋ねていますが、値はdf1.x!= df2.xのままにしておきたいので、Transfer values from one dataframe to anotherとは異なります。質問にリンクされている場合、条件に合わない値はNA値です。上のリンクへの答えに基づいてsqldf()を使用する例については、以下を参照してください。

> sqldf('SELECT df1.x , df2.y 
+  FROM df1 
+  LEFT JOIN df2 
+  ON df2.x = df1.x') 
    x y 
1 1 NA 
2 1 NA 
3 2 25 
4 3 NA 
5 4 100 
6 4 100 
7 4 100 
8 5 NA 
9 6 75 
10 7 100 
+2

どのような条件ですか? x値が一致しないと、df1の2番目の行y値をdf2の最初の行y値に置き換えるのはなぜですか? – rawr

+0

私はそれを明確にすべきだった。条件は次のとおりです。df1 $ x == df2 $ xの場合、df1 $ yをdf2 $ yに置き換えます。一致しない場合は何も行いません。メインの投稿を編集してこの条件を追加します。 –

答えて

2

あなたは、まず、2つのデータフレームをマージして、要素を置き換えるためdplyrパッケージを使用することができます。
library(dplyr) df1 <- merge(df1, df2, by = "x", all = T) %>% mutate(y = ifelse(is.na(y.y), y.x, y.y)) %>% select(x, y)

+0

すごくうまくいった! –