2017-06-19 1 views
0

Ich versuche, eine neue Spalte in einem vorhandenen Datenrahmen (DF1) zu erstellen, indem ich die Werte der Spalte x mit den Werten der Spalte y in einem anderen Datenrahmen (DF2) vergleiche.Neue Spalte im Datenrahmen basierend auf Übereinstimmung zwischen zwei Spalten

Das Ergebnis sollte wie df_end aussehen. Wo eine Übereinstimmung vorliegt, sollte der Wert von Spalte x zurückgegeben werden. Wo es keine Übereinstimmung gibt, sollte NA zurückgegeben werden.

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)) 

Ich habe experimentiert mit merge, match und wenn, sonst Aussagen, aber ich kann es nicht herausfinden. Jemand hat einen Ratschlag für mich?

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

Dies funktioniert nicht, da df1 und df2 unterschiedlich lang sind.

+0

Verwenden 'merge' mit dem' all true' Argumente = und stellen Sie die ' by.x' und 'by.y' Argumente, um den jeweiligen Variablennamen zu entsprechen. – lmo

+2

'df2 $ y [Übereinstimmung (df1 $ x, df2 $ y)]' – Sotos

Antwort

1

Ich habe folgende:

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: siehe Kommentar sotos für die beste Antwort: df2$y[match(df1$x, df2$y)]

+0

diese Lösung hat funktioniert. Schließlich habe ich Sotos Lösung verwendet, weil es ein wenig prägnanter ist :) – SHW

+0

Ja, ich weiß nicht, warum ich auf die Match-Funktion XD ausgeblendet habe –

Verwandte Themen