web-dev-qa-db-fra.com

Supprimer des lignes qui existent dans un autre cadre de données?

J'ai les deux cadres de données suivants (exemple):

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

Je voudrais supprimer les lignes dans df1 pour lesquelles df1$name = df2$name obtenir ce qui suit:

Sortie:

name    profile    type    strand
D       14.0       1       -
E       45.1       1       -
F       32.8       1       -

Si quelqu'un pouvait me dire quel code utiliser, ce serait beaucoup d'aide, cela paraissait simple au début, mais je le déconne depuis hier.

29
biohazard

Vous avez besoin de l'opérateur %in%. Alors, 

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

devrait vous donner ce que vous voulez.

  • df1$name %in% df2$name teste si les valeurs dans df1$name sont dans df2$name
  • L'opérateur ! inverse le résultat.
37
csgillespie

Cela s'appelle parfois un anti-join :

library(dplyr)
anti_join(df1, df2, by = "name")
21
Hugh
df1[!(as.character(df1$jobId) %in% as.character(df2$name)), ]

J'ai dû ajouter as.character à mon exécution car name n'est pas un caractère mais un facteur. %in% n'est-il pas censé convertir cela directement?

1
user2635283