18

Ho i due seguenti telegrammi di dati (esempio):Elimina le righe che esistono in un altro frame di dati?

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 

Vorrei eliminare le righe in df1 per i quali df1$name = df2$name per ottenere il seguente:

Uscita:

Se qualcuno potesse dirmi quale pezzo di codice usare sarebbe stato di grande aiuto, all'inizio sembrava semplice, ma da ieri ho iniziato a rovinarlo.

+1

suggerisco di leggere alcuni manuali su R, buon punto di partenza http://stackoverflow.com/tags/r/info – zx8754

+0

Grazie per il link utile! – biohazard

risposta

24

È necessario l'operatore %in%. Quindi,

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

dovrebbe darti quello che vuoi.

  • df1$name %in% df2$name test se i valori in df1$name sono in df2$name
  • L'operatore ! inverte il risultato.
+0

Grazie mille! Hai idea di cosa dovrei fare per renderlo simmetrico? Ho notato che 'df1 [! (Df1 $ nome% in% df2 $ nome),]' e 'df2 [! (Df2 $ nome% in% df1 $ nome),] mi dà risultati diversi ... – biohazard

+0

e se il nome della colonna non è univoco? – Cina

+1

In un frame di dati, le colonne devono essere univoche. – csgillespie

0

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

ho dovuto aggiungere as.charaacter alla mia esecuzione perché non è JobID un personaggio e un fattore, invece, non è% in% dovrebbe convertire questo direttamente

12

questo è talvolta chiamato un anti-join:

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