2017-06-19 19 views
0

既存のデータフレーム(df1)に新しい列を作成しようとしましたが、異なるデータフレーム(df2)の列yの値と比較しています。2つの列間の一致に基づいたデータフレームの新しい列

結果はdf_endのようになります。一致がある場合は、列xの値を返す必要があります。一致がない場合は、NAを返す必要があります。

df1 <- data.frame(x = c("blue2", "blue6", "green9", "green7")) 
df2 <- data.frame(y = c("blue2", "green9")) 

df_end <- data.frame(x = c("blue2", "blue6", "green9", "green7"), 
        match = c("blue2", NA, "green9", NA)) 

私はマージ、マッチ、if、else文で実験しましたが、わかりません。誰かが私のためのアドバイスを持っていますか?

#Attempt 1: Merge 
df1$match <- merge(df1, df2, by.x = x, all = TRUE) 

df1とdf2の長さが異なるため、これは機能しません。

+0

は 'すべて= true'の引数を指定して' merge'を使用して 'を調整しますby.x'と 'by.y'引数をそれぞれの変数名にマッチさせます。 – lmo

+2

'df2 $ y [match(df1 $ x、df2 $ y)] ' – Sotos

答えて

1

私は次のようでした:

df1 <- data.frame(x = c("blue2", "blue6", "green9", "green7")) 
df2 <- data.frame(y = c("blue2", "green9")) 

end <- sapply(df1$x, function(x) { # for each value in df1$x 
    j <- which(df2$y == x) # check if df2$y has a match 
    ifelse(length(j) > 0, j, NA) # if there is, give the location in the vector 
}) # if not give NA 

cbind(df1,df2, match = df2$y[end]) # subset the df2 with the location to get the characters 

#  x  y match 
#1 blue2 blue2 blue2 
#2 blue6 green9 <NA> 
#3 green9 blue2 green9 
#4 green7 green9 <NA> 

EDIT:は が最良の答えのためのソトスはコメントを参照してください。df2$y[match(df1$x, df2$y)]

+0

この解決策は機能しました。最終的に私は少し簡潔ですので、私はsotosのソリューションを使用しました:) – SHW

+0

はい、私はなぜマッチ関数XDで空白を知りません –

関連する問題