Manipulation des données textuelles

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

ameni melki
Messages : 40
Enregistré le : 24 Fév 2021, 14:54

Manipulation des données textuelles

Messagepar ameni melki » 23 Fév 2022, 16:51

Bonjour,

J'ai un champ dans ma base de type caractère qui comporte 2 parties: les critères et leurs poids pondérés, il est écris de la façon suivante:

Code : Tout sélectionner

list(`#text` = c("Prix des prestations", "Délai d'exécution", "Qualité"), `@POIDS` = c("50", "45", "5"))
list(`#text` = c("Prix", "Valeur technique"), `@POIDS` = c("40", "60"))
list(`#text` = c("Valeur téchnique de l'offre", "Valeur financière de l'offre"), `@POIDS` = c("60", "40"))


Les critères et leur poids sont dans la même colonne et comme vous voyer le nombre et le type de critère sont différents chaque fois.

Mon objectif est de mettre les poids devant les critères correspondant comme ceci:

Code : Tout sélectionner

list(`#text` = c("Prix des prestations"=50, "Délai d'exécution"=45, "Qualité"=5)
list(`#text` = c("Prix"=40, "Valeur technique"=60)
list(`#text` = c("Valeur téchnique de l'offre"=60, "Valeur financière de l'offre"=40)


Est ce que ceci est faisable dans R? vu le format des données?

Merci

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

Re: Manipulation des données textuelles

Messagepar Pierre-Yves Berrard » 23 Fév 2022, 17:07

C'est tout à fait possible :

Code : Tout sélectionner

liste1 <- list(
  `#text` = c("Prix des prestations", "Délai d'exécution", "Qualité"),
  `@POIDS` = c("50", "45", "5")
)

setNames(
  as.numeric(liste1$`@POIDS`),
  liste1$`#text`
)
PY

ameni melki
Messages : 40
Enregistré le : 24 Fév 2021, 14:54

Re: Manipulation des données textuelles

Messagepar ameni melki » 25 Fév 2022, 09:43

Bonjour,

Merci pour votre réponse et votre aide.

Code : Tout sélectionner

liste1 <- list(
  `#text` = c("Prix des prestations", "Délai d'exécution", "Qualité"),
  `@POIDS` = c("50", "45", "5"))


Dans votre code liste1 est une data frame avec 2 variables (text et @POIDS chacune dans une colonne), dans ma base text et @Poids sont 2 variables dans la même colonne nommée Prix donc ils sont considérés comme une seule variable dans R

Mon objectifs est d'avoir ce résultat:

Code : Tout sélectionner

PRIX
list(`#text` = c("le prix"=40, "la valeur technique et thérapeutique"=40, "les prestations logistiques du fournisseur"=15, "le développement durable"=5))
list(`#text` = c("Valeur technique"=50, "Prix"=50))
list(`#text` = c("Valeur technique"=60, "Prix des prestations"=40))
list(`#text` = c("Prix des prestations"=50, "Délai d'exécution"=45, "Qualité"=5))


Je veux avoir une seule variable dans la colonne, chaque poids devant son critère (text) comme ça je peux après séparer chaque critère par la virgule

j'espère que c'est clair, merci beaucoup pour votre aide.

Cordialement

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

Re: Manipulation des données textuelles

Messagepar Mickael Canouil » 25 Fév 2022, 13:00

Bonjour,

"liste1" de Pierre-Yves est exactement de la même nature que ce que vous avez indiqué dans votre premier message.
Au passage, c'est une liste "simple" et non data.frame.

Si vous voulez une réponse réponse, il convient de suivre les recommendations de ce forum:

Cordialement,
Mickaël
mickael.canouil.fr | rlille.fr

ameni melki
Messages : 40
Enregistré le : 24 Fév 2021, 14:54

Re: Manipulation des données textuelles

Messagepar ameni melki » 25 Fév 2022, 13:49

Bonjour,

Merci pour votre retour rapide, désolé j'ai mal exprimé le problème.

J'ai appliqué le code de Pierre-Yves mais j'ai eu des erreurs, je ne sais pas comment l'appliquer sur toute la colonne, son code s'applique sur une seule ligne uniquement.
Avec ma base de donnée "data" et la colonne "PRIX" qui contient ces informations je ne peux pas écrire

Code : Tout sélectionner

liste1$`@POIDS`,
  liste1$`#text`
car text et @Poids ne sont pas des variables, je ne peux mettre que

Code : Tout sélectionner

data$PRIX
.

Pour faire ça, il faut scinder la colonne Prix en 2 colonnes ;une colonne text et un colonne @Poids

Merci pour votre compréhension.

Cordialement

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

Re: Manipulation des données textuelles

Messagepar Mickael Canouil » 25 Fév 2022, 16:30

Pourquoi ne pas fournir un extrait en suivant le lien indiqué plus tôt ?
Mickaël
mickael.canouil.fr | rlille.fr

ameni melki
Messages : 40
Enregistré le : 24 Fév 2021, 14:54

Re: Manipulation des données textuelles

Messagepar ameni melki » 25 Fév 2022, 17:14

Ce n'ai pas un jeu de données crée dans R mais une base externe importé qui contienne des milliers d'observations, du coup j'ai mis 3 lignes de la base comme exemple pour la visualiser.

Ci-dessous un extrait de 4 lignes de la base "data" avec uniquement la colonne "PRIX" (je n'ai pas intégrer les autres variables en raison de la longueur des champs textuel)

Code : Tout sélectionner

PRIX
list(`#text` = c("le prix", "la valeur technique et thérapeutique", "les prestations logistiques du fournisseur", "le développement durable"), `@POIDS` = c("40", "40", "15", "5"))
list(`#text` = c("Valeur téchnique de l'offre", "Valeur financière de l'offre"), `@POIDS` = c("60", "40"))
list(`#text` = c("Prix", "Qualité de l'offre"), `@POIDS` = c("60", "15"))
list(`#text` = c("Prix", "Qualité technique de l'offre", "Qualité environnementale de l'offre"), `@POIDS` = c("45", "50", "5"))


Peut être vous avez confondu à cause du mot list, ici c'est pas une fonction mais fait partie des données, malheureusement je traite des données avec une syntaxe compliqué , et je dois modifier le contenu des champs pour avoir des variables exploitables et qui peuvent être analyser, comme dans cet exemple 2 champs qui on été mis dans la même colonne.

J'espère que c'est clair, j'ai essayé d’intégrer une capture écran de la base mais j'ai pas réussi.

Cordialement

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

Re: Manipulation des données textuelles

Messagepar Pierre-Yves Berrard » 25 Fév 2022, 19:11

Code : Tout sélectionner

message <- "Bon je suis un peu perdu, mais si vous avez ce qui ressemble diablement à du code R sous forme de texte, je suggère de simplement l'évaluer avec la fonction"
eval()
PY

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

Re: Manipulation des données textuelles

Messagepar Pierre-Yves Berrard » 26 Fév 2022, 10:48

Code : Tout sélectionner

donnees_str <- c(
  "list(`#text` = c(\"le prix\", \"la valeur technique et thérapeutique\", \"les prestations logistiques du fournisseur\", \"le développement durable\"), `@POIDS` = c(\"40\", \"40\", \"15\", \"5\"))",
  "list(`#text` = c(\"Valeur téchnique de l'offre\", \"Valeur financière de l'offre\"), `@POIDS` = c(\"60\", \"40\"))",
  "list(`#text` = c(\"Prix\", \"Qualité de l'offre\"), `@POIDS` = c(\"60\", \"15\"))",
  "list(`#text` = c(\"Prix\", \"Qualité technique de l'offre\", \"Qualité environnementale de l'offre\"), `@POIDS` = c(\"45\", \"50\", \"5\"))"

Code : Tout sélectionner

donnees <- lapply(
  donnees_str,
  function(x) eval(str2lang(x)) 
)

lapply(
  donnees,
  function(liste1) setNames(as.numeric(liste1$`@POIDS`), liste1$`#text`)
)
#> [[1]]
#>                                    le prix 
#>                                         40 
#>       la valeur technique et thérapeutique 
#>                                         40 
#> les prestations logistiques du fournisseur 
#>                                         15 
#>                   le développement durable 
#>                                          5 
#> 
#> [[2]]
#>  Valeur téchnique de l'offre Valeur financière de l'offre 
#>                           60                           40 
#> 
#> [[3]]
#>               Prix Qualité de l'offre 
#>                 60                 15 
#> 
#> [[4]]
#>                                Prix        Qualité technique de l'offre 
#>                                  45                                  50 
#> Qualité environnementale de l'offre 
#>                                   5        

Created on 2022-02-26 by the reprex package (v2.0.1)
PY

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

Re: Manipulation des données textuelles

Messagepar Mickael Canouil » 26 Fév 2022, 12:09

Vous importez bien la base dans R ? Sinon à quoi bon utiliser le code R de Pierre-Yves si vous n'avez rien dans R.
Vous avez donc un objet/variable R, par exemple "donnees" (une liste ou un data.frame, ce qui revient au même avec le code ci-dessous).

Code : Tout sélectionner

dput(head(donnees[["PRIX"]]))
Mickaël
mickael.canouil.fr | rlille.fr

ameni melki
Messages : 40
Enregistré le : 24 Fév 2021, 14:54

Re: Manipulation des données textuelles

Messagepar ameni melki » 28 Fév 2022, 10:21

Bonjour,

Je vous remercie pour vos retour, vous m'avez énormément aider, je suis désolé pour la mauvaise explication du problème au début.

La fonction lapply et eval donne bien le résultat voulu dans la console.

J'ai essayé de mettre le résultat sous format data frame mais j'ai eu ce message d'erreur

Error in (function (..., row.names = NULL, check.rows = FALSE, check.names = TRUE, :
les arguments impliquent des nombres de lignes différents : 4, 2, 3


Je crois c'est normal puisque le nombre d'arguments est différents.

J'ai testé un exemple où le nombre de critères (#text) et le prix (@POIDS) est exactement le même est j'ai changé en data frame

Code : Tout sélectionner

data<- lapply(
  donnees,
  function(liste1) setNames(as.numeric(liste1$`@POIDS`), liste1$`#text`))     
 
data<- as.data.frame(data)


J'ai eu une base de données inversée c'est à dire au lieu d'avoir 50 observations et 3 variables j'ai eu 3 observations et 50 variables.

Dans le cas normal où le nombre de critère est différent d'une ligne à une autre, comment je peux appliquer cette fonction pour que je puisse avoir le résultat sous data frame

Car avec une base de données avec des milliers d'observations avoir le résultat dans la console n'est pas exploitable.

Merci pour votre aide

Cordialement

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

Re: Manipulation des données textuelles

Messagepar Pierre-Yves Berrard » 28 Fév 2022, 14:49

Bonjour,
Sûrement avec dplyr::bind_rows(data) au lieu de as.data.frame(data)

J'ajoute que les choix qui s'offrent à vous ne sont pas uniquement "data.frame" ou "dans la console". Vous pouvez également garder le format liste qui est souvent adapté pour des objets hétéroclites comme celui-ci.
PY

ameni melki
Messages : 40
Enregistré le : 24 Fév 2021, 14:54

Re: Manipulation des données textuelles

Messagepar ameni melki » 03 Mar 2022, 08:25

Merci beaucoup pour votre aide, j'ai obtenu le résultat que j'ai voulu!

Merci pour vos conseils.

Cordialement


Retourner vers « Questions en cours »

Qui est en ligne

Utilisateurs parcourant ce forum : Google [Bot] et 1 invité

cron