Extraction d'observations non communes à plusieurs df

Postez ici vos questions, réponses, commentaires ou suggestions - Les sujets seront ultérieurement répartis dans les archives par les modérateurs

Modérateur : Groupe des modérateurs

Sondes Kahouli
Messages : 17
Enregistré le : 14 Juil 2016, 09:48

Extraction d'observations non communes à plusieurs df

Messagepar Sondes Kahouli » 27 Sep 2016, 17:34

Bonjour à tous,

Je dispose de deux bases de données. La première contient en environ 9 000 ménages et la deuxième 500. Toutes les observations de la deuxième base de données se trouvent déjà dans la première.

Je souhaite extraire de ces deux bases uniquement les menages NON communs (environ 8 500). Chaque ménage est identifié dans les deux bases à l’aide d’un identifiant "idmen"

Quelle est la fonction qui permet de le faire ? Un petit bout de code peut-être ?

ps : Vous m'avez déjà orienté auparavant vers les fonctions match et intersect qui permettent d'extraire les valeurs communes :

viewtopic.php?f=3&t=8216&p=38206#p38206

A partir de cela, j'ai pensé qu'il serait possible de demander à R de m'afficher les valeurs non communes qu'il stocke certainement qq part mais je ne sais pas faire !

Merci d’avance et bonne soirée/journée.

Serge Rapenne
Messages : 1426
Enregistré le : 20 Aoû 2007, 15:17
Contact :

Re: Extraction d'observations non communes à plusieurs df

Messagepar Serge Rapenne » 27 Sep 2016, 20:38

Bonjour,

une solution possible :

Code : Tout sélectionner

outersect <- function(x, y) {
  sort(c(setdiff(x, y),
         setdiff(y, x)))
}

id_different<-outersect(base1$idmem,base2$idmem)
base_diff<-rbind(base1[base1$idmem %in% id_different,],base2[base2$idmem %in% id_different,]

par exemple

Code : Tout sélectionner

base1<-data.frame(idmem=1:10,valeur=runif(10,1,10))
base1
   idmem   valeur
1      1 3.156665
2      2 1.530409
3      3 6.780594
4      4 8.886423
5      5 8.010232
6      6 8.175779
7      7 5.097470
8      8 4.690757
9      9 8.297832
10    10 6.444400

base2<-data.frame(idmem=5:14,valeur=runif(10,1,10))

base2
   idmem   valeur
1      5 9.785536
2      6 7.586133
3      7 4.210542
4      8 4.883263
5      9 2.333904
6     10 1.117698
7     11 7.440095
8     12 1.928658
9     13 5.016559
10    14 6.760909

id_different<-outersect(base1$idmem,base2$idmem)
> id_different
[1]  1  2  3  4 11 12 13 14
rbind(base1[base1$idmem %in% id_different,],base2[base2$idmem %in% id_different,])
   idmem   valeur
1      1 3.156665
2      2 1.530409
3      3 6.780594
4      4 8.886423
7     11 7.440095
8     12 1.928658
9     13 5.016559
10    14 6.760909


Edit :
si
Toutes les observations de la deuxième base de données se trouvent déjà dans la première.
alors

Code : Tout sélectionner

setdiff(base1$idmem,base2$idmem)
suffit pour obtenir les idmem de base1 absent dans base2

Serge

Delphine Corneil
Messages : 96
Enregistré le : 12 Fév 2014, 13:29

Re: Extraction d'observations non communes à plusieurs df

Messagepar Delphine Corneil » 28 Sep 2016, 08:25

Bonjour,
Pour récupérer les ménages plutôt que les identifiants quelque chose du genre devrait marcher :

Code : Tout sélectionner

base_new <- base1[setdiff(base1$idmem,base2$idmem),]
In R i trust

Didier Plat
Messages : 225
Enregistré le : 02 Nov 2009, 16:47
Contact :

Re: Extraction d'observations non communes à plusieurs df

Messagepar Didier Plat » 28 Sep 2016, 08:55

Bonjour,
setdiff renvoie les valeurs de base1$idmem qui ne sont pas dans base2$idmem et donc le résultat ne peut pas être utilisé "directement", comme dans l'exemple de Delphine, pour sélectionner les ménages de base1.
Une autre solution pour obtenir directement les ménages peut être de passer directement par %in% qui lui renvoie un vecteur de TRUE/FALSE :

Code : Tout sélectionner

base1[!(base1$idmem %in% base2$idmem),]

Pierre-Yves Berrard
Messages : 1029
Enregistré le : 12 Jan 2016, 23:30

Re: Extraction d'observations non communes à plusieurs df

Messagepar Pierre-Yves Berrard » 28 Sep 2016, 09:28

Un alternative bien pratique :
dplyr::anti_join
PY

Sondes Kahouli
Messages : 17
Enregistré le : 14 Juil 2016, 09:48

Re: Extraction d'observations non communes à plusieurs df

Messagepar Sondes Kahouli » 28 Sep 2016, 12:00

Parfait, je vous remercie.
Bonne journée à tous.

Jean-Emmanuel Longueville
Messages : 310
Enregistré le : 23 Fév 2011, 08:03

Re: Extraction d'observations non communes à plusieurs df

Messagepar Jean-Emmanuel Longueville » 03 Oct 2016, 07:57

Sinon y a toutjours le classique on selectionne les communs que l'on enlève
intersect(df1$idmen, df2$idmen)
df[-commun,]
Jean-Emmanuel
Ingénieur d'étude LNEC


Retourner vers « Questions en cours »

Qui est en ligne

Utilisateurs parcourant ce forum : Aucun utilisateur enregistré et 1 invité

cron