2017-12-31 32 views
1

Ich starrte nur mit R und ich versuche, 2 Spalten von zwei verschiedenen Tabellen zu vergleichen. Wenn die Übereinstimmung wahr ist, dann möchte ich den spezifischen Wert (in DF1) ersetzen. Ich habe auch das Problem, dass ich sehr über die Verwendung zusätzlicher Pakete eingeschränkt bin, da ich das Skript in einer Datenbank verwenden möchte.Vergleichen und ersetzen Frames/Tabellen bestimmte Zeilen

df1:

DE 
Deutschland 
England 
Germany 
Italien 

df2

GE    EN 
Deutschland  Germany 
Italien   Italy 
England   UK 

Ergebnis: df1:

DE 
Deutschland 
England 
**Deutschland** 
Italien 

Ich versuchte folgenden Code ein:

df1 <- data.frame("DE" = c("Deutschland", "England", "Germany", "Italien")) 
df2 <- data.frame("GE" = c("Deutschland", "Italien", "England"), "EN" = c("Germany", "Italy", "UK")) 
df1[] <- lapply(df1, as.character) 
df2[] <- lapply(df2, as.character) 

df1 <- ifelse(!(df1$DE %in% df2$EN), df1$DE, df2$GE) 

Statt "Deutschland" ersetzt es "England". Wie kann ich die richtige Zeile ersetzen?

Antwort

6

Eine mögliche Lösung match mit nomatch -Operator mit:

df1$DE[df1$DE %in% df2$EN] <- df2$GE[match(df1$DE, df2$EN, nomatch = 0)] 

die gibt:

> df1 
      DE 
1 Deutschland 
2  England 
3 Deutschland 
4  Italien 

Was das bedeutet:

  • df1$DE[df1$DE %in% df2$EN] gibt an, welche Zeilen in df1 einen Ersatz benötigen.
  • df2$GE[match(df1$DE, df2$EN, nomatch = 0)] wählt die Ersetzungen von df2.
  • Letztere kann der ehemaligen mit <- zugewiesen werden.

Wie von @ r2evans in the comments, %in%match unter der Haube verwendet. Basierend auf diesem Wissen können Sie auch tun:

ind <- match(df1$DE, df2$EN, nomatch = 0) 
df1$DE[ind > 0] <- df2$GE[ind] 

Da der Index ind jetzt erst einmal erstellt, kann dies zu einem erheblichen spead Anstieg auf große Datenmengen führen kann.


Sie auch diese kommen mit einem Update tun könnte mit data.table:

# load the package 
library(data.table) 

# convert the dataframes to data.table's 
setDT(df1) 
setDT(df2) 

# perform the update join 
df1[df2, on = .(DE = EN), DE := GE][] 

die das gleiche Ergebnis ergibt:

  DE 
1: Deutschland 
2:  England 
3: Deutschland 
4:  Italien 
+2

'% in%' verwendet 'Spiel '. Bei großen Datasets kann es vorteilhaft sein, 'ind <- match (df1 $ DE, df2 $ EN, nomatch = 0) 'gefolgt von' df1 $ DE [ind> 0] <- df2 $ GE [ind] 'zu verwenden. (Mit diesem kleinen Datensatz ist er schon um 30% schneller, aber dieser Zeitunterschied ist nicht signifikant.) – r2evans

+0

Danke für die Antwort und Erklärung :) –

+1

@ r2evans thx & added :-) – Jaap

Verwandte Themen