2017-01-27 4 views
0

Angenommen, ich habe zwei Datenrahmen, so dass:Zusammenführen von zwei Datenrahmen von Grepl in 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 

Was ich wollte, ist df1 und df2 von Grepl df2 den verschmelzen x in df2 die x, so dass ein gewünschtes Ergebnis wäre :

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

Die eigentlichen Datenrahmen sind viel größer und scheint ein paar Zeilen dafür zu brauchen. Ich frage mich, ob es einen leichten Weg geben könnte.

Antwort

5

Hier ist ein Ein-Liner, die für df2.x auf der Suche nach links in df1.x verbindet:

library(sqldf) 

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

giving:

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

Hier ist eine Basis R Methode, wenn jedes Element funktioniert von df2 hat ein Einzelspiel auf ein Element von 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)) wird durch jedes Element von df2$x laufen und finden Sie die passende Position innerhalb df1$x, der Ausgang wird ein Vektor sein.


Um diese robusten Nicht-Übereinstimmungen zwischen den beiden zu machen, können Sie das folgende tun könnte. Im folgenden Beispiel findet "j" keine Übereinstimmung. Die [1] am Ende von grep erzwingt eine NA anstelle der Standard integer(0).

# 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 

Nun, verwenden Sie diese mit is.na die subsetting Vektoren der Teilmenge.

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 
Verwandte Themen