problème avec la fonction merge et inner_join

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

Théo Denis
Messages : 9
Enregistré le : 21 Jan 2019, 15:24

problème avec la fonction merge et inner_join

Messagepar Théo Denis » 22 Jan 2019, 10:25

Bonjour à tous !

Tout d'abord, étant nouveau sur ce forum, n'hésitez pas à me guider ou me réorienter.

Je rencontre actuellement un problème avec la fonction merge (et inner_join également) qui ne sont pourtant pas si compliquées.
Je souhaite concaténer deux data frames avec, il me semblre, la même colonne de référence. Seulement, lorsque je lance la commande, la fonction ne reconnait pas certains facteurs et les omet (ou bien me les double avec des NAs lorsque je demande all = T). J'ai beau essayer de comprendre ce qui bloque, je ne vois clairement pas... Les noms de la colonne de référence semble exactement correspondre.

Avez-vous déjà rencontré ce problème et comment y remédier ?

Merci beaucoup pour votre aide !

Je ne sais pas comment vous communiquer la base sur laquelle je travaille... Elle est en open source sur le site de transparency international : https://www.visualiserlacorruption.fr/presentation

Je vous donne mon script ci-dessous (le problème est à la fin du script) :

Code : Tout sélectionner

data = read.csv("Affaires-judiciaires.csv", header = T, sep = ",", encoding = "UTF-8", stringsAsFactors = F)

# Je crée une data frame qui regroupe les infractions telles qu'elles sont dans la base

pass = str_split(data$infractions.pertinentes,";", simplify = T)
pass = as.data.frame(pass)

V1 = data.frame(levels(pass$V1),1);colnames(V1)=c("id","x")
V2 = data.frame(levels(pass$V2),1);colnames(V2)=c("id","y")
V3 = data.frame(levels(pass$V3),1);colnames(V3)=c("id","z")
V4 = data.frame(levels(pass$V4),1);colnames(V4)=c("id","t")
V5 = data.frame(levels(pass$V5),1);colnames(V5)=c("id","u")
V6 = data.frame(levels(pass$V6),1);colnames(V6)=c("id","v")
V7 = data.frame(levels(pass$V7),1);colnames(V7)=c("id","w")
V8 = data.frame(levels(pass$V8),1);colnames(V8)=c("id","g")

lev = merge(V1,V2,by="id",all = T)
lev = merge(lev,V3,by="id",all = T)
lev = merge(lev,V4,by="id",all = T)
lev = merge(lev,V5,by="id",all = T)
lev = merge(lev,V6,by="id",all = T)
lev = merge(lev,V7,by="id",all = T)
lev = merge(lev,V8,by="id",all = T)
lev = lev[-78,]
lev = lev[,-c(2:9)]
lev = factor(lev)

Infractions1 = as.data.frame(lev)
colnames(Infractions1) = c("Infractions_1")

# Je ressors chaque infraction dans une variable unique

CI = data
CI$Absence_controle_validation_paiements = str_detect(CI$infractions.pertinentes,"Absence de contrôle et de validation pour des paiements")
CI$Abus_autorité.Usurpation_fonction = str_detect(CI$infractions.pertinentes,"Abus d'autorité/Usurpation de fonction")
CI$Abus_biens_sociaux = str_detect(CI$infractions.pertinentes,"Abus de biens sociaux")
CI$Abus_confiance = str_detect(CI$infractions.pertinentes,"Abus de confiance")
CI$Abus_confiance_détournement_données = str_detect(CI$infractions.pertinentes,"Abus de confiance pour détournement de données")
CI$Abus_faiblesse = str_detect(CI$infractions.pertinentes,"Abus de faiblesse")
CI$Abus_pouvoir = str_detect(CI$infractions.pertinentes,"Abus de pouvoir")
CI$Achat_parrainages_votes = str_detect(CI$infractions.pertinentes,"Achat de parrainages ou votes")
CI$Aides_Etat_illicites = str_detect(CI$infractions.pertinentes,"Aides d'Etat illicites")
CI$Annulation_PV_contraventions = str_detect(CI$infractions.pertinentes,"Annulation de PV, faire sauter des contraventions")
CI$Association_malfaiteurs = str_detect(CI$infractions.pertinentes,"Association de malfaiteurs")
CI$Atteinte_liberté_accès_marchés_pu = str_detect(CI$infractions.pertinentes,"Atteinte à la liberté d'accès aux marchés publics")
CI$Atteintes_code_éléctoral = str_detect(CI$infractions.pertinentes,"Atteintes au code électoral")
CI$Attribution_illégale_commande = str_detect(CI$infractions.pertinentes,"Attribution illégale de commande")
CI$Avantages_injustifiés = str_detect(CI$infractions.pertinentes,"Avantages injustifiés")
CI$Banqueroute = str_detect(CI$infractions.pertinentes,"Banqueroute")
CI$Blanchiment_argent_biens = str_detect(CI$infractions.pertinentes,"Blanchiment d'argent ou de biens")
CI$Blanchiment_trafic_stupéfiants = str_detect(CI$infractions.pertinentes,"Blanchiment de trafic de stupéfiants")
CI$Chantage = str_detect(CI$infractions.pertinentes,"Chantage")
CI$Clientélisme_népotisme = str_detect(CI$infractions.pertinentes,"Clientélisme, népotisme")
CI$Commission_occulte = str_detect(CI$infractions.pertinentes,"Commission occulte")
CI$Compétition_pari_truqué = str_detect(CI$infractions.pertinentes,"Compétition ou pari truqué")
CI$Complicité = str_detect(CI$infractions.pertinentes,"Complicité")
CI$Complicité_de_faux = str_detect(CI$infractions.pertinentes,"Complicité de faux")
CI$Cpts_campagne_rejeté_finct_politique_illicite = str_detect(CI$infractions.pertinentes,"Financement politique")
CI$Concurrence_déloyale = str_detect(CI$infractions.pertinentes,"Concurrence déloyale")
CI$Concussion = str_detect(CI$infractions.pertinentes,"Concussion")
CI$Corruption_agents_publics_internationaux = str_detect(CI$infractions.pertinentes,"Corruption d'agents publics internationaux")
CI$Corruption_pas_act = str_detect(CI$infractions.pertinentes,"Corruption passive ou active")
CI$Déclarations_patrimoine_intérêts_fausses = str_detect(CI$infractions.pertinentes,"Déclarations")
CI$Défiscalisation = str_detect(CI$infractions.pertinentes,"Défiscalisation")
CI$Délit_initié = str_detect(CI$infractions.pertinentes,"Délit d'initié")
CI$Dénonciation_mensongère = str_detect(CI$infractions.pertinentes,"Dénonciation mensongère")
CI$Dépenses_cpts_campagne_éléctorale = str_detect(CI$infractions.pertinentes,"Dépenses comptes de campagne électorale")
CI$Détournement_biens = str_detect(CI$infractions.pertinentes,"Détournement de biens")
CI$Détournement_biens_pu = str_detect(CI$infractions.pertinentes,"Détournement de biens publics")
CI$Détournement_informatique_mail_données = str_detect(CI$infractions.pertinentes,"Détournement de courriels, données, accès frauduleux à un système informatique")
CI$Détournement_fonds = str_detect(CI$infractions.pertinentes,"Détournement de fonds")
CI$Détournement_pouvoir = str_detect(CI$infractions.pertinentes,"Détournement de pouvoir")
CI$Détournement_fonds_pu = str_detect(CI$infractions.pertinentes,"Détournements de fonds publics")
CI$Discri_embauche = str_detect(CI$infractions.pertinentes,"Discrimination à l'embauche")
CI$Dissimulation = str_detect(CI$infractions.pertinentes,"Dissimulation")
CI$Emplois_fictifs = str_detect(CI$infractions.pertinentes,"Emplois fictifs/de complaisance")
CI$Entente_illicite = str_detect(CI$infractions.pertinentes,"Entente illicite")
CI$Escro_fraude = str_detect(CI$infractions.pertinentes,"Escroquerie / Fraude")
CI$Extorsion = str_detect(CI$infractions.pertinentes,"Extorsion")
CI$Extorsion_fonds = str_detect(CI$infractions.pertinentes,"Extorsion de fonds")
CI$Falsifi_docu_admin = str_detect(CI$infractions.pertinentes,"falsification de documents administratifs")
CI$Fausse_attestation_procuration = str_detect(CI$infractions.pertinentes,"Fausse attestation/procuration")
CI$Fausse_décla = str_detect(CI$infractions.pertinentes,"Fausse déclaration")
CI$Fausses_délibérations = str_detect(CI$infractions.pertinentes,"Fausses délibérations")
CI$Fautes_gestion = str_detect(CI$infractions.pertinentes,"Fautes de gestion")
CI$Faux_écriture = str_detect(CI$infractions.pertinentes,"Faux en écriture")
CI$Faux_écriture_pu = str_detect(CI$infractions.pertinentes,"Faux en écriture publique")
CI$Faux_usage_faux = str_detect(CI$infractions.pertinentes,"Faux et usage de faux")
CI$Favoritisme = str_detect(CI$infractions.pertinentes,"Favoritisme")
CI$Financement_campagne_éléctorale_illicite = str_detect(CI$infractions.pertinentes,"Financement de campagne électorale illicite")
CI$Fraude_électorale = str_detect(CI$infractions.pertinentes,"fraude électorale")
CI$Fraude_fiscale = str_detect(CI$infractions.pertinentes,"Fraude Fiscale/Manquement aux obligations fiscales")
CI$Gestion_fait = str_detect(CI$infractions.pertinentes,"Gestion de fait")
CI$Harcèlment = str_detect(CI$infractions.pertinentes,"Harcèlement")
CI$Infraction_codes_urbanisme_environnement = str_detect(CI$infractions.pertinentes,"Infraction aux codes de l'urbanisme ou de l'environnement")
CI$Manquements_obligations_conseils_probité = str_detect(CI$infractions.pertinentes,"Manquements aux obligations de conseils et probité")
CI$Illégalité_marchés_pu = str_detect(CI$infractions.pertinentes,"Non Egalité, attribution illégale, non respect des règles d'un marché public")
CI$Obtention_ill_docu_admin = str_detect(CI$infractions.pertinentes,"Obtention illégale d'un document administratif")
CI$Organisation_frauduleuse_insolvabilité = str_detect(CI$infractions.pertinentes,"Organisation frauduleuse d'insolvabilité")
CI$Pot_de_vin = str_detect(CI$infractions.pertinentes,"Pot-de-vin")
CI$Pratiques_anti_concurrentielles = str_detect(CI$infractions.pertinentes,"Pratiques anti-concurrentielles")
CI$P2I_CI_Ingérence = str_detect(CI$infractions.pertinentes,"Prise illégale d'intérêts_Conflit d'intérêts-Ingérence")
CI$Racket = str_detect(CI$infractions.pertinentes,"Racket")
CI$Salaires_indemnités_illégalement_perçus = str_detect(CI$infractions.pertinentes,"Salaires et indemnités illégalement perçus")
CI$Subornation_témoin = str_detect(CI$infractions.pertinentes,"Subornation de témoin")
CI$Trafic_influence = str_detect(CI$infractions.pertinentes,"Trafic d'influence")
CI$Trafics = str_detect(CI$infractions.pertinentes,"Trafics")
CI$Travail_dissimulé = str_detect(CI$infractions.pertinentes,"Travail dissimulé_illégal")
CI$violation_secret_pro = str_detect(CI$infractions.pertinentes,"Violation du secret professionnel")
CI$vol = str_detect(CI$infractions.pertinentes,"Vol")
CI$Atteinte_probité = str_detect(CI$infractions.pertinentes,"Atteinte à la Probité")
CI$Atteintes_environnement = str_detect(CI$infractions.pertinentes,"Atteintes à l'environnement")
CI$Contrefaçon = str_detect(CI$infractions.pertinentes,"Contrefaçon")
CI$Exercice_illégale_profession = str_detect(CI$infractions.pertinentes,"Exercice illégal d'une profession")
CI$Fausse_facture = str_detect(CI$infractions.pertinentes,"Fausse facture, facture excessive")
CI$Négligences = str_detect(CI$infractions.pertinentes,"Négligences")
CI$Partage_illégal_marché = str_detect(CI$infractions.pertinentes,"Partage illégal de marché")
CI$Recel = str_detect(CI$infractions.pertinentes,"Recel")
CI$Rupture_égalité_charges_publiques = str_detect(CI$infractions.pertinentes,"Rupture d'égalité devant les charges publiques")
CI$Travaux_sans_permis_construire = str_detect(CI$infractions.pertinentes,"Travaux sans Permis de Construire")
CI$Violation_règles_fin_manip_cours = str_detect(CI$infractions.pertinentes,"Violation des règles financières et de Marché/ Manipulation de cours")
CI$Violences = str_detect(CI$infractions.pertinentes,"Violences")
CI$Rétrocommission = str_detect(CI$infractions.pertinentes,"Rétrocommission")
CI$Usurpation_titre_fonction = str_detect(CI$infractions.pertinentes,"Usurpation de titre/fonction")
CI$vente_frauduleuse = str_detect(CI$infractions.pertinentes,"Vente frauduleuse")
CI$Non_dénonciation_faits_délictueux = str_detect(CI$infractions.pertinentes,"Non dénonciation de faits délictueux")
CI$Spoliation = str_detect(CI$infractions.pertinentes,"Spoliation")
data = CI
rm(CI)

# je crée une base qui contient les noms des variables pour chaque infraction

Infractions2 = labels(data[,15:108])
Infractions2 = as.data.frame(Infractions2[[2]])
colnames(Infractions2) = c("Infractions_2")

Je crée une base de correspondance entre les noms des variables et la dénomination des infractions

Infractions3 = cbind(Infractions1, Infractions2)

# Je souhaite travailler sur une sous base df :

df = data[which(str_detect(data$infractions.pertinentes, "Faux et usage de faux") == T),]

# Pour finir, je veux une base qui contient le nombre de TRUE pour chaque infraction.
# Je pars donc du nom de mes variables mais le but est d'automatiser cette table pour que lorsque je change d'infraction ( "Faux et usage de faux" ici), je puisse supprimer l'infraction sélectionnée. Comme la sélection des infractions se fait à partir de la base directement (donc de appellation d'origine des infractions), je dois concaténer la table de correspondance à la table ci-dessous pour repérer l'infraction sélectionnée et la supprimer. Or, c'est ici même que ça coince. La fonction merge ou inner_join ne prend pas en compte les infractions chantage, racket, trafics, vol et recel...

Infractions = as.matrix(summary(df[,15:108]))
Infractions[is.na(Infractions)] = "TRUE :0"
Infractions = as.data.frame(Infractions)
Infractions = Infractions[,-1]
colnames(Infractions) = c("Infractions_2", "X")

### PROBLEM IS HERE ! ###
#Infractions = merge(Infractions, Infractions3, by = c("Infractions_2"), all = T)
#Infractions = Infractions[-which(str_detect(Infractions$Infractions_1, "Faux et usage de faux") == T)]

Infractions$Sum_True = NULL
Infractions$Sum_True[which(str_detect(Infractions$X,"TRUE")==T)] = str_sub(Infractions$X,7,9)[which(str_detect(Infractions$X,"TRUE")==T)]
Infractions = Infractions[,c(1,3)]
Infractions = Infractions[which(is.na(Infractions$Sum_True)==F),]
Infractions$Sum_True = as.numeric(Infractions$Sum_True)

# Encore merci de votre aide !

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

Re: problème avec la fonction merge et inner_join

Messagepar Serge Rapenne » 22 Jan 2019, 11:14

Bonjour,

il est possible que les colonnes ai le même nom mais soit de type différents, verifie le type des colonnes avec la fonction str

Serge

Théo Denis
Messages : 9
Enregistré le : 21 Jan 2019, 15:24

Re: problème avec la fonction merge et inner_join

Messagepar Théo Denis » 23 Jan 2019, 09:00

Serge Rapenne a écrit :Bonjour,

il est possible que les colonnes ai le même nom mais soit de type différents, verifie le type des colonnes avec la fonction str

Serge


Merci Serge,

J'ai vérifié et les deux contiennent des facteurs avec le même nombre de levels. C'est ce qui est déroutant, tout semble être bon...
J'ai essayé de passer les colonnes en character et de refaire la concaténation, sans succès.

Existe t-il une autre fonction semblable a merge et inner_join dans un autre package pouvant contourner ces deux dernières?

Théo

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

Re: problème avec la fonction merge et inner_join

Messagepar Serge Rapenne » 23 Jan 2019, 09:47

Peux tu fournir 2 jeux de données pour pouvoir faire des tests via la fonction dput, soit avec les objets complets (par ex dput(V1)) s'ils ne sont pas trop gros ou avec des extraits (par ex dput(V1[1:20,]) mais dans ce cas, il faudra faire attention à fournir des extrait avec des éléments communs pour pouvoir tester les jointures.
En plan B tu peux également partager les données sur un "Drive" (google Drive, oneDrive ...)

Serge

Théo Denis
Messages : 9
Enregistré le : 21 Jan 2019, 15:24

Re: problème avec la fonction merge et inner_join

Messagepar Théo Denis » 23 Jan 2019, 10:10

Serge Rapenne a écrit :Peux tu fournir 2 jeux de données pour pouvoir faire des tests via la fonction dput, soit avec les objets complets (par ex dput(V1)) s'ils ne sont pas trop gros ou avec des extraits (par ex dput(V1[1:20,]) mais dans ce cas, il faudra faire attention à fournir des extrait avec des éléments communs pour pouvoir tester les jointures.
En plan B tu peux également partager les données sur un "Drive" (google Drive, oneDrive ...)

Serge


Je ne peux pas joindre de fichier sur le forum...
Ci-dessous tu trouvera un lien de partage ggDrive et dans mon premier message tu peux trouver le lien pour télécharger les données complètes directement du site.

https://drive.google.com/open?id=1OMp0Y ... u6ZWQcfDG9

Théo

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

Re: problème avec la fonction merge et inner_join

Messagepar Pierre-Yves Berrard » 23 Jan 2019, 10:36

Théo Denis a écrit :Je ne peux pas joindre de fichier sur le forum...

Comment insérer des données dans un message
PY

Théo Denis
Messages : 9
Enregistré le : 21 Jan 2019, 15:24

Re: problème avec la fonction merge et inner_join

Messagepar Théo Denis » 23 Jan 2019, 11:17

Pierre-Yves Berrard a écrit :
Théo Denis a écrit :Je ne peux pas joindre de fichier sur le forum...

Comment insérer des données dans un message


Merci ! J'ai pris note ;)

Mickael Canouil
Messages : 540
Enregistré le : 04 Avr 2011, 08:53
Contact :

Re: problème avec la fonction merge et inner_join

Messagepar Mickael Canouil » 23 Jan 2019, 16:58

Bonjour,

Personnellement, je trouve que l'utilisation de facteurs pour la manipulation de jeu de donnée est dangereuse et pas pratique.

Je vois que vous parlez des fonctions merge et inner_join et que vous parlez de mettre l'argument "all=TRUE".
Si merge(..., all = TRUE), dans ce cas c'est full_join(...). inner_join est l'équivalent de merge(..., all = FALSE)

Et, j'ai l'impression que ce que vous voulez avoir, c'est le résultat ci-dessous :

Code : Tout sélectionner

library(tidyverse)
Affaires_judiciaires <- readr::read_csv("Affaires-judiciaires.csv")
dta <- Affaires_judiciaires %>%
  tidyr::separate_rows(`infractions pertinentes`, sep = ";") %>%
  dplyr::mutate(infraction = 1) %>%
  tidyr::spread(key = `infractions pertinentes`, value = "infraction", fill = 0)


Code : Tout sélectionner

dta %>%
  dplyr::filter(`Faux et usage de faux`==1) %>%
  dplyr::count()

165 "Faux et usage de faux" ici par exemple

Il faut cependant bien nettoyer la variable `infractions pertinentes` avant de la manipuler, par exemple :

Code : Tout sélectionner

setdiff(colnames(dta), colnames(Affaires_judiciaires))[c(93, 94)]
[1] "falsification de documents administratifs"                                     
[2] "falsification de documents administratifs "

Ici un espace de trop dans le nom.

Cordialement,
Mickaël

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

Re: problème avec la fonction merge et inner_join

Messagepar Serge Rapenne » 24 Jan 2019, 08:47

Bonjour,

Si j'ai bien compris ta demande, tu cherches à savoir quelles infractions sont présentent dans chacune des 8 colonnes.

J'ai repris ton code avec une légère modification et je ne vois pas de pb

Code : Tout sélectionner

library(stringr)
library(dplyr)
library(tidyr)

data = read.csv("code_R/tmp/Affaires-judiciaires.csv", header = T, sep = ",", encoding = "UTF-8", stringsAsFactors = F)

pass = str_split(data$infractions.pertinentes,";", simplify = T)
pass = as.data.frame(pass)

V1 = data.frame(levels(factor(pass$V1,)),1);colnames(V1)=c("id","x")
V2 = data.frame(levels(factor(pass$V2)),1);colnames(V2)=c("id","y")
V3 = data.frame(levels(factor(pass$V3)),1);colnames(V3)=c("id","z")
V4 = data.frame(levels(factor(pass$V4)),1);colnames(V4)=c("id","t")
V5 = data.frame(levels(factor(pass$V5)),1);colnames(V5)=c("id","u")
V6 = data.frame(levels(factor(pass$V6)),1);colnames(V6)=c("id","v")
V7 = data.frame(levels(factor(pass$V7)),1);colnames(V7)=c("id","w")
V8 = data.frame(levels(factor(pass$V8)),1);colnames(V8)=c("id","g")


lev = merge(V1,V2,by="id",all = T)
lev = merge(lev,V3,by="id",all = T)
lev = merge(lev,V4,by="id",all = T)
lev = merge(lev,V5,by="id",all = T)
lev = merge(lev,V6,by="id",all = T)
lev = merge(lev,V7,by="id",all = T)
lev = merge(lev,V8,by="id",all = T)

et j'obtiens exactement le même résultat en passant par tidyr/dplyr :

Code : Tout sélectionner

pass_long<-pass %>% gather(id,infraction) %>% filter(infraction!="")

lev2<-pass_long %>% group_by(infraction,id) %>% summarise(n=n()>=1) %>% spread(id,n)


Serge

Théo Denis
Messages : 9
Enregistré le : 21 Jan 2019, 15:24

Re: problème avec la fonction merge et inner_join

Messagepar Théo Denis » 24 Jan 2019, 09:24

Mickael Canouil a écrit :Bonjour,

Personnellement, je trouve que l'utilisation de facteurs pour la manipulation de jeu de donnée est dangereuse et pas pratique.

Je vois que vous parlez des fonctions merge et inner_join et que vous parlez de mettre l'argument "all=TRUE".
Si merge(..., all = TRUE), dans ce cas c'est full_join(...). inner_join est l'équivalent de merge(..., all = FALSE)

Et, j'ai l'impression que ce que vous voulez avoir, c'est le résultat ci-dessous :

Code : Tout sélectionner

library(tidyverse)
Affaires_judiciaires <- readr::read_csv("Affaires-judiciaires.csv")
dta <- Affaires_judiciaires %>%
  tidyr::separate_rows(`infractions pertinentes`, sep = ";") %>%
  dplyr::mutate(infraction = 1) %>%
  tidyr::spread(key = `infractions pertinentes`, value = "infraction", fill = 0)


Code : Tout sélectionner

dta %>%
  dplyr::filter(`Faux et usage de faux`==1) %>%
  dplyr::count()

165 "Faux et usage de faux" ici par exemple

Il faut cependant bien nettoyer la variable `infractions pertinentes` avant de la manipuler, par exemple :

Code : Tout sélectionner

setdiff(colnames(dta), colnames(Affaires_judiciaires))[c(93, 94)]
[1] "falsification de documents administratifs"                                     
[2] "falsification de documents administratifs "

Ici un espace de trop dans le nom.

Cordialement,


Bonjour Mickael,

Merci beaucoup pour votre code, cela m'a permis de réduire considérablement le mien...

Votre solution m'a permis de contourner mon problème puisque j'ai maintenant des noms de variable qui correspondent exactement aux noms de chaque infraction. Je n'ai donc plus besoin d'une table de correspondance pour "merger" mes deux types de tables avec des noms différents.

Cordialement,

Théo

Théo Denis
Messages : 9
Enregistré le : 21 Jan 2019, 15:24

Re: problème avec la fonction merge et inner_join

Messagepar Théo Denis » 24 Jan 2019, 09:29

Serge Rapenne a écrit :Bonjour,

Si j'ai bien compris ta demande, tu cherches à savoir quelles infractions sont présentent dans chacune des 8 colonnes.

J'ai repris ton code avec une légère modification et je ne vois pas de pb

Code : Tout sélectionner

library(stringr)
library(dplyr)
library(tidyr)

data = read.csv("code_R/tmp/Affaires-judiciaires.csv", header = T, sep = ",", encoding = "UTF-8", stringsAsFactors = F)

pass = str_split(data$infractions.pertinentes,";", simplify = T)
pass = as.data.frame(pass)

V1 = data.frame(levels(factor(pass$V1,)),1);colnames(V1)=c("id","x")
V2 = data.frame(levels(factor(pass$V2)),1);colnames(V2)=c("id","y")
V3 = data.frame(levels(factor(pass$V3)),1);colnames(V3)=c("id","z")
V4 = data.frame(levels(factor(pass$V4)),1);colnames(V4)=c("id","t")
V5 = data.frame(levels(factor(pass$V5)),1);colnames(V5)=c("id","u")
V6 = data.frame(levels(factor(pass$V6)),1);colnames(V6)=c("id","v")
V7 = data.frame(levels(factor(pass$V7)),1);colnames(V7)=c("id","w")
V8 = data.frame(levels(factor(pass$V8)),1);colnames(V8)=c("id","g")


lev = merge(V1,V2,by="id",all = T)
lev = merge(lev,V3,by="id",all = T)
lev = merge(lev,V4,by="id",all = T)
lev = merge(lev,V5,by="id",all = T)
lev = merge(lev,V6,by="id",all = T)
lev = merge(lev,V7,by="id",all = T)
lev = merge(lev,V8,by="id",all = T)

et j'obtiens exactement le même résultat en passant par tidyr/dplyr :

Code : Tout sélectionner

pass_long<-pass %>% gather(id,infraction) %>% filter(infraction!="")

lev2<-pass_long %>% group_by(infraction,id) %>% summarise(n=n()>=1) %>% spread(id,n)


Serge


Bonjour Serge,

Effectivement c'est ce que je faisais pour sortir les différentes infractions répertoriées dans infractions pertinentes. Avec le code de Mickael, j'ai pu faire ça automatiquement et cela me permet de contourner le problème avec la fonction merge (sans le résoudre au fond). Mais le problème que j'avais était bien plus bas dans mon code lorsque il fallait concaténer les tables avec 2 noms différents pour chaque variable (les noms originaux de la table contenu dans "infractions pertinentes" et ceux que j'avais donné à mes variables).

Encore merci pour ton aide !

Théo


Retourner vers « Questions en cours »

Qui est en ligne

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