IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

R Discussion :

Extraire une chaîne de caractères


Sujet :

R

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Homme Profil pro
    Data analyst
    Inscrit en
    Mars 2014
    Messages
    81
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Data analyst
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2014
    Messages : 81
    Par défaut Extraire une chaîne de caractères
    Hello tout le monde,

    ça fait une semaine que je cherche je ne trouve pas.

    Voici mon problème :

    je possède dans un data frame une variable sous format factor, cette variable est alphanumérique, qui contient des chaîne de caractères, les mots sont séparés par des slash ("/")

    exemple:

    var1
    "AAA/BBB/CCC"
    "BBB"
    "CCC/AAA"
    "ZZZ/PPP"

    je voudrais les mettre comme ça
    var1
    "AAA"
    "BBB"
    "CCC"
    "BBB"
    "CCC"
    "AAA"
    "ZZZ"
    "PPP"
    donc en gros extraire ce qui est séparés la le slash et le mettre en ligne.


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    table$var1<-as.character(table$var1)
    table$var1<-(strsplit(table$var1, '/'))
    mais comme c'est un dataframe, il n'accepte pas la variable créée puisque le nombre de lignes est différents. et moi je voudrai dupliquer toutes ligne du dataframe avec cette variable.

    Merci à vous.

  2. #2
    Modératrice

    Femme Profil pro
    Statisticienne, Fondatrice de la société DACTA
    Inscrit en
    Juin 2010
    Messages
    893
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 37
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Statisticienne, Fondatrice de la société DACTA

    Informations forums :
    Inscription : Juin 2010
    Messages : 893
    Par défaut
    Bonjour,

    Il y a très certainement moyen de faire "plus propre", mais une première idée qui me vient comme ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    X <- data.frame(ID = 1:4, xxx = c("A1", "A2", "A1", "A3"), var1= c("AAA/BBB/CCC", "BBB", "CCC/AAA", "ZZZ/PPP")) # jeu de données d'exemple
      ID xxx        var1
    1  1  A1 AAA/BBB/CCC
    2  2  A2         BBB
    3  3  A1     CCC/AAA
    4  4  A3     ZZZ/PPP
     
     
    list_vars1 <- strsplit(as.character(X$var1), "/")
     
     
    S <- NULL
     
    for(i in 1:(length(list_vars1)))
    {
        ll <- list_vars1[[i]]
        nl <- length(ll)
     
        a <- data.frame(rep(X$ID[i], nl), rep(X$xxx[i], nl), ll)
     
        S <- rbind(S, a)
    }
     
    colnames(S) <- colnames(X)
     
    S <- as.data.frame(S)
      ID xxx var1
    1  1  A1  AAA
    2  1  A1  BBB
    3  1  A1  CCC
    4  2  A2  BBB
    5  3  A1  CCC
    6  3  A1  AAA
    7  4  A3  ZZZ
    8  4  A3  PPP

    Remarque : un conseil, évite d'appeler ton jeu de données "table" car c'est également le nom d'une fonction dans R...

    [EDIT : si quelqu'un a une idée de comment faire cette manipulation avec le package "dplyr", ça m'intéresse ^^]


    Bonne continuation


    Cordialement,


    A.D.

    Forum R
    Fournir le code utilisé (pensez aux balises code !), les packages nécessaires, ainsi qu'un court mais représentatif extrait du jeu de données et les éventuels messages d'erreur.
    Recherche d'informations concernant R : RSiteSearch / tutoriels : http://r.developpez.com/cours/ .

    Pensez également au bouton "Résolu" et à voter (en bas à droite des messages) lorsque vous avez obtenu une réponse satisfaisante.

  3. #3
    Membre confirmé
    Homme Profil pro
    Data analyst
    Inscrit en
    Mars 2014
    Messages
    81
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Data analyst
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2014
    Messages : 81
    Par défaut
    Yes, c'est noté pour le nom table, merci, ta solution marche très bien pour deux variables, cependant j'ai plus de 200 variables, j'ai essayé avec colnames, ça ne marche pas!

    Pourrais-tu m'aider là-dessus, stp?

  4. #4
    Membre expérimenté
    Homme Profil pro
    Bioinformaticien
    Inscrit en
    Octobre 2008
    Messages
    126
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Autre

    Informations professionnelles :
    Activité : Bioinformaticien
    Secteur : Enseignement

    Informations forums :
    Inscription : Octobre 2008
    Messages : 126
    Par défaut
    Citation Envoyé par A. D. Voir le message
    ... [EDIT : si quelqu'un a une idée de comment faire cette manipulation avec le package "dplyr", ça m'intéresse ^^] ...
    Bonjour,
    Une proposition de solution à l'aide de la bibliothèque plyr dont le mainteneur est le même que pour dplyr.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    library("stringr")
    library("plyr")
     
    X <- as.data.frame(list(
    	ID = seq_len(4),
    	xxx = c("A1", "A2", "A1", "A3"),
    	var1= c("AAA/BBB/CCC", "BBB", "CCC/AAA", "ZZZ/PPP")),
    	stringsAsFactors = FALSE)
     
    print(X)
      ID xxx        var1
    1  1  A1 AAA/BBB/CCC
    2  2  A2         BBB
    3  3  A1     CCC/AAA
    4  4  A3     ZZZ/PPP
    

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
     
    sepLignes <- function(obj) {
    	motif <- "/"
     
    	if(str_detect(obj[[3]], motif)) {
    		symboles <- str_split(obj[[3]], motif)[[1]]
     
    		return(as.data.frame(t(sapply(
    			symboles,
    			function(troisiemeValeur) {
    				obj[3] <- troisiemeValeur
    				return(obj)
    			}
    		)), stringsAsFactors = FALSE))
    	}
     
    	return(obj)
    }
     
    S <- adply(.data = X, .margins = 1L, .fun = sepLignes)
    print(S)
      ID xxx var1
    1  1  A1  AAA
    2  1  A1  BBB
    3  1  A1  CCC
    4  2  A2  BBB
    5  3  A1  CCC
    6  3  A1  AAA
    7  4  A3  ZZZ
    8  4  A3  PPP
    

  5. #5
    Membre confirmé
    Homme Profil pro
    Data analyst
    Inscrit en
    Mars 2014
    Messages
    81
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Data analyst
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2014
    Messages : 81
    Par défaut
    Cool merci à tous :-)

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 22
    Dernier message: 22/10/2012, 21h53
  2. Réponses: 3
    Dernier message: 22/09/2012, 13h38
  3. Extraire une chaîne de caractères
    Par Lamouette66 dans le forum PL/SQL
    Réponses: 2
    Dernier message: 17/07/2012, 09h25
  4. Réponses: 4
    Dernier message: 27/08/2010, 04h57
  5. Extraire une chaîne de caractères d'une chaîne
    Par dj-julio dans le forum Excel
    Réponses: 13
    Dernier message: 21/09/2007, 11h05

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo