2017-01-27 2 views
0

でgreplによって2つのデータフレームをマージ:私がするような2つのデータフレームがあるとR

私が望んで
df1<-data.frame(x=c("abc", "def", "ghi", NA), y=1:4) 
df1 
    x y 
1 abc 1 
2 def 2 
3 ghi 3 
4 NA 4 
df2<-data.frame(x=c("a", "i"), z=4:5) 
df2 
    x z 
1 a 4 
2 i 5 

がgrepl DF2のx DF2のx望ましい結果があろうと、そのような中でdf1df2をマージすることです:

df3 
    x y z 
1 abc 1 4 
2 def 2 NA 
3 ghi 3 5 
4 NA 4 NA 

実際のデータフレームははるかに大きく、数行必要です。私は簡単な方法があるかどうか疑問に思っています。ここで

答えて

5

は左df1.xdf2.xの検索に参加するワンライナーです:

library(sqldf) 

sqldf("select df1.*, df2.z from df1 left join df2 on instr(df1.x, df2.x)") 

寄付:

 x y z 
1 abc 1 4 
2 def 2 NA 
3 ghi 3 5 
4 <NA> 4 NA 
0

ここでは、のすべての要素ならば動作するベースR方式でありますdf2は、df1の要素と単一の一致を有する。

# initialize new varible with NAs 
df1$z <- NA 
# fill in matching indices with df2$z 
df1$z[sapply(df2$x, function(i) grep(i, df1$x, fixed=TRUE))] <- df2$z 

sapply(df2$x, function(i) grep(i, df1$x, fixed=TRUE))df2$xの各要素を実行し、df1$xの一致する位置を見つけると、出力はベクトルになります。


これを2つの間で一致しないようにするには、次のようにします。以下の例では、 "j"は一致するものを見つけられません。 grepの末尾にある[1]は、デフォルトのinteger(0)の代わりにNAを強制します。

# get indices match with NAs for non-matches 
matches <- unlist(lapply(c("a", "j"), function(i) grep(i, df1$x, fixed=TRUE)[1])) 
matches 
[1] 1 NA 

ここでis.naでこれを使用して、サブセット化ベクトルをサブセット化します。

df1$z[matches[!is.na(matches)]] <- df2$z[!is.na(matches)] 
df1 
    x y z 
1 abc 1 4 
2 def 2 NA 
3 ghi 3 NA 
4 <NA> 4 NA 
関連する問題