2016-12-12 5 views
1

Ich möchte die Zeilen aus ds1 auswählen, deren alle Spaltenwerte im zweiten Datenrahmen ds2 vorhanden sind. Ich habe diesen langen Weg gefunden, aber es gibt eine eingebaute Funktion, die den Prozess vereinfacht.Wählen Sie Zeilen aus einem Datenrahmen aus, in dem alle Spaltenwerte im zweiten Datenrahmen vorhanden sind.

ds1 = data.frame(x=c(0,3,2,4,5), y=c(6,7,8,9,10), z=c(11,12,13,14,16)) 
ds2 = data.frame(x=c(1,2,3,4,5), y=c(6,7,8,9,10), z=c(11,12,13,14,15)) 

Da die Werte ds1$x[1] und ds1$z[5] existieren nicht in Spalten: ds2$x und ds2$z bzw. sollten solche Zeilen nicht berücksichtigt, so Endergebnis sein sollte:

x y z 
2 3 7 12 
3 2 8 13 
4 4 9 14 

daher die Zeilen: ds1[2:4,] , Ich fand diesen langen Weg:

result <- matrix(NA, nrow(ds1), ncol(ds1)) 
count = 1 
for (i in names(ds2)) { 
    result[,count] <- ds1[, i] %in% ds2[, i] 
    count <- count + 1 
} 

rows = rep(NA, nrow(ds1)) 
for (i in 1:length(rows)) { 
    rows[i] = all(result[i,]) 
} 
# Finally: 
ds1[rows,] 

Ich vermute, es sollte einen einfacheren Weg existieren mit einigen integrierten funktionskombinationen google ich, aber ich habe keinen ähnlichen fall gefunden.

Hinweis: Ich war mit merge, zum Beispiel zu spielen: merge(ds1,ds2):

> merge(ds1, ds2) 
    x y z 
1 4 9 14 

, sondern weil die Spaltenelemente in unterschiedlichen Reihen wie in sein können: ds1$x[2] == ds2$x[3] und ds1x[3] == ds2$x[2], funktioniert es nicht und Ich weiß nicht, wie man die zusätzlichen Zusammenführungsargumente einstellt, um das erwartete Ergebnis zu erhalten.

+0

'% in% ', wie unten dargestellt ist vorzuziehen, aber man könnte es mit ein paar tun von Verknüpfungen -' merge (merge (DS1, DS2 [" gefunden x "]), ds2 [" z "])' – thelatemail

Antwort

2

Sie können nur die %in% und & Syntax verwenden, um dies auszudrücken sehr einfach und prägnant:

ds1[ds1$x %in% ds2$x & ds1$z %in% ds2$z,] 
x y z 
2 3 7 12 
3 2 8 13 
4 4 9 14 

Dies sagt R „Wählen Sie die Zeilen von ds1, wenn die folgenden zwei Bedingungen wahr:

  1. Der Wert von ds1$x irgendwo für ds1$z in ds2$x
  2. Ebenso "
+0

Danke @ Hack-R, das ist nur ein Spielzeugbeispiel, in meinem wirklichen Problem habe ich rund 52 Spalten, also brauche ich noch eine for-Schleife. –

+1

@DavidLeal Sicher, aber wäre es auf diese Weise nicht schneller als mit einer For-Schleife? Wenn Sie ein Beispiel veröffentlichen, das repräsentativer für die Daten ist, die ich Ihnen zeigen kann. Dies kann auf eine beliebige Anzahl von Spalten skaliert werden, und for-Schleifen sind exponentiell langsamer als vektorisierte Lösungen. Je mehr Spalten Sie verwenden, desto weniger möchten Sie eine for-Schleife verwenden. –

+0

Ich habe Ihren Punkt, Ihre Empfehlung verwendet eine Lösung wie folgt: 'ds1 [ds1 $ x1% in% ds2 $ x1 & ds1 $ x2% in% ds2 $ x2 & ds1 $ x3% in% ds2 $ x3 ... & ds1 $ xn% in% ds2 $ xn,] '(bis zu n Variablen) skalieren besser als eine For-Loop-Lösung. Es wird eine große Aussage für meinen Fall sein, aber weniger zeitaufwendig. –

Verwandte Themen