Boucles et création de data frame à partir de XML

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

Boucles et création de data frame à partir de XML

Messagepar Théo Denis » 24 Jan 2019, 16:05

Bonjour à tous,

Je cherche désespérément à créer un data frame à partir de données que je récupère de fichiers XML. Le but est d'extraire plusieurs informations de chaque fichier XML.
Le tableau que je souhaite obtenir serait semblable à celui-ci :

Code : Tout sélectionner

tab_final
   Nom      Naissance   Fonction            Responsable_de
1   Serge    1945      Directeur            NA
2   Marie    1986      Adjointe de direction   Fabrice
3   Marie    1986      Adjointe de direction   Julie
4   Jean      1990      Directeur financier      Mickael
5   Jean      1990      Directeur financier      Dominique
6   Jean      1990      Directeur financier      Patrice
7   Anne      1972      Analyste            NA

tab_final <- structure(list(nom = structure(c(4L, 3L, 3L, 2L, 2L, 2L, 1L), .Label = c("Anne",
"Jean", "Marie", "Serge"), class = "factor"), naissance = c(1945,
1986, 1986, 1990, 1990, 1990, 1972), fonction = structure(c(3L,
1L, 1L, 4L, 4L, 4L, 2L), .Label = c("Adjointe de direction",
"Analyste", "Directeur", "Directeur financier"), class = "factor"),
    Nmoins1 = structure(c(NA, 2L, 3L, 4L, 1L, 5L, NA), .Label = c("Dominique",
    "Fabrice", "Julie", "Mickael", "Patrice"), class = "factor")), class = "data.frame", row.names = c(NA,
-7L))


Pour obtenir cela j'utilise une boucle (mais d'après ce que j'ai lu, dans R, les boucles c'est pas super...). Je n'arrive pas à obtenir plusieurs lignes pour une même personne. Ma boucle va avoir tendance à me retourner le tableau suivant (avec la dernière itération pour chaque personne):

Code : Tout sélectionner

tab_final
   Nom      Naissance   Fonction            Responsable_de
1   Serge   1945      Directeur            NA
2   Marie   1986      Adjointe de direction   Julie
3   Jean      1990      Directeur financier      Patrice
4   Anne      1972      Analyste            NA


J'ai essayé d'imbriquer deux boucles comme ci-dessous mais je n'arrive pas à trouver le moyen de placer la dimension j dans les vecteurs (par exemple Nom[i] qui devrait contenir j)

Code : Tout sélectionner

for (i in 1:n) {
  for (j in 1:length(xml_find_all(Direction[[i]],"items/items"))) {
    Nom[i] = xml_text(xml_find_all(Direction[[i]], ".//nom")[j])
    Naissance[i] = xml_text(xml_find_all(Direction[[i]], ".//naissance")[j])
    Fonction[i] = xml_text(xml_find_all(Direction[[i]], ".//fonction")[j])
    Responsable_de[i] = xml_text(xml_find_all(Direction[[i]], ".//responsabilite")[j])
  }
  test = as.data.frame(cbind(Nom,Naissance,Fonction,Responsable_de))
}


Je suis preneur de toute solution, avec ou sans boucle si il est possible d'utiliser des fonctions R pour cela.

Merci beaucoup !

Théo

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

Re: Boucles et création de data frame à partir de XML

Messagepar Mickael Canouil » 24 Jan 2019, 16:25

Bonjour,

Il est toujours plus simple d'aider avec tout ou partie des données et surtout un code reproductible.
"Qu'est-ce qu'un code reproductible ?" => viewtopic.php?f=1&t=7638
"Comment insérer des données dans un message" => viewtopic.php?f=1&t=3302

Cordialement,
Mickaël

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

Re: Boucles et création de data frame à partir de XML

Messagepar Théo Denis » 27 Jan 2019, 11:30

Bonjour à tous,

J'ai trouvé le moyen de faire ce que je voulais. Pour information, voici le code utilisé.

Code : Tout sélectionner

#Création de l'objet qui recevra les données
direction.df = NULL
# La boucle permettant de récupérer les données souhaitées
for (i in 1:n) {
  Nom = NULL
  Naissance = NULL
  Fonction = NULL
  Responsable_de = NULL
  Nom = xml_text(xml_find_all(General[[i]], ".//nom"))
  Naissance = xml_text(xml_find_all(General[[i]], "//naissance"))
  Fonction = xml_text(xml_find_all(General[[i]], "//fonction"))
  for (j in 1:length(xml_find_all(Direction[[i]],"items/items"))) {
    Responsable_de[j] = xml_text(xml_find_all(Direction[[i]], ".//responsabilite")[j])
  }
  direction.df[[i]] = as.data.frame(cbind(Nom,Naissance,Fonction,Responsable_de, deparse.level = 1))
}

# La boucle sort dans une liste les data.frames créées séparément.
# La commande ci dessous permet de concaténer chaque data.frame comprise dans la liste.

direction.df <- Reduce(function(x, y) merge(x, y, all = T), direction.df)


J'obtiens ainsi le tableau final souhaité :

Code : Tout sélectionner

direction.df
   Nom      Naissance   Fonction            Responsable_de
1   Serge    1945      Directeur            NA
2   Marie    1986      Adjointe de direction   Fabrice
3   Marie    1986      Adjointe de direction   Julie
4   Jean      1990      Directeur financier      Mickael
5   Jean      1990      Directeur financier      Dominique
6   Jean      1990      Directeur financier      Patrice
7   Anne      1972      Analyste            NA


Théo

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

Re: Boucles et création de data frame à partir de XML

Messagepar Théo Denis » 27 Jan 2019, 11:35

Mickael Canouil a écrit :Bonjour,

Il est toujours plus simple d'aider avec tout ou partie des données et surtout un code reproductible.
"Qu'est-ce qu'un code reproductible ?" => viewtopic.php?f=1&t=7638
"Comment insérer des données dans un message" => viewtopic.php?f=1&t=3302

Cordialement,


Bonjour Mickael,

Merci pour ces informations. J'essaye autant que faire se peut de constituer un code reproductible. J'en ai pris note, seulement, avec des données en xml, la fonction dput() ne permet pas de sortir un code lisible. Je n'ai pas réussi à faire un code permettant de reconstituer le xml d'origine...

Merci pour votre implication.

Théo


Retourner vers « Questions en cours »

Qui est en ligne

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