18

Ich habe die beiden folgenden Datenrahmen (Beispiel):Zeilen löschen, die in einem anderen Datenrahmen vorhanden sind?

df1:

name profile type strand 
A  4.5  1  + 
B  3.2  1  + 
C  5.5  1  + 
D  14.0  1  - 
E  45.1  1  - 
F  32.8  1  - 
G  19.9  1  + 

df2:

name 
A 
B 
C 
G 

Ich möchte die Zeilen in df1 für die df1$name = df2$name löschen die bekommen folgende:

Ausgabe:

Wenn mir jemand sagen könnte, welchen Code ich verwenden würde, dann wäre das zunächst einfach, aber seit gestern habe ich es vermasselt.

+1

Schlagen ein paar Handbücher auf R, guter Ausgangspunkt Lesen http://stackoverflow.com/tags/r/info – zx8754

+0

Danke für den nützlichen Link! – biohazard

Antwort

24

Sie benötigen den Operator %in%. Also,

df1[!(df1$name %in% df2$name),] 

sollte Ihnen geben, was Sie wollen.

  • df1$name %in% df2$name prüft, ob die Werte in df1$name sind in df2$name
  • Der ! Operator kehrt das Ergebnis.
+0

Vielen Dank! Hast du eine Idee, was ich tun soll, um es symmetrisch zu machen? Ich habe bemerkt, dass 'df1 [! (Df1 $ name% in% df2 $ name),]' und 'df2 [! (Df2 $ name% in% df1 $ name)]' gib mir andere Ergebnisse ... – biohazard

+0

was wäre wenn Der Spaltenname ist nicht eindeutig? – Cina

+1

In einem Datenrahmen müssen die Spalten eindeutig sein. – csgillespie

0

df1 [! (As.character (df1 $ jobId)% in% as.character (DF2 $ jobId))]

hatte ich as.charaacter zu meiner Hinrichtung hinzuzufügen, weil JobID nicht ist stattdessen ein Zeichen und ein Faktor, ist nicht% in% sollte diesen direkt

12

Dies wird manchmal konvertieren bezeichnet eine anti-join:

library(dplyr) 
anti_join(df1, df2, by = "name") 
Verwandte Themen