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 :

Une boucle (apply, for, etc.) pour ce code ?


Sujet :

R

  1. #1
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2015
    Messages
    20
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 29
    Localisation : France, Val d'Oise (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2015
    Messages : 20
    Points : 4
    Points
    4
    Par défaut Une boucle (apply, for, etc.) pour ce code ?
    Bonjour,


    J'ai à ma disposition une base de données sur laquelle j'aurais aimé à partir d'une variable, en créer d'autres.
    Les données ayant été saisies automatiquement sous Sphinx, il est assez difficile de les interpréter sous cette forme qui est la suivante.

    Variable :
    - 1. ex1 ; 2. ex2
    - 2. ex2 ; 5. ex5 ; 7. ex7
    - NA
    - 3. ex3
    - ...

    Concrètement, pour chaque colonne et donc individu, chaque case ayant été coché lors de la saisie se retrouve dans cette même variable. Chacune étant séparé par un point virgule.
    Ainsi, j'aurais aimé pouvoir ajouter une colonne pour chacune des modalités et ce, sous forme binaire (1 si modalité, 0 si pas la modalité).

    J'ai donc écrit le code suivant (les données ayant été modifiées pour apporter une certaine clarté et ne sont donc pas systématiquement sous ces mêmes formes) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    data$ex1 <- ifelse(regexpr("1. ex1", data$var) == -1, data$ex1 <- 0, data$ex1 <- 1)
    data$ex2 <- ifelse(regexpr("2. ex2", data$var) == -1, data$ex2 <- 0, data$ex2 <- 1)
    data$ex3 <- ifelse(regexpr("3. ex3", data$var) == -1, data$ex3 <- 0, data$ex3 <- 1)
    data$ex4 <- ifelse(regexpr("4. ex4", data$var) == -1, data$ex4 <- 0, data$ex4 <- 1)
    data$ex5 <- ifelse(regexpr("5. ex5", data$var) == -1, data$ex5 <- 0, data$ex5 <- 1)
    data$ex6 <- ifelse(regexpr("6. ex6", data$var) == -1, data$ex6 <- 0, data$ex6 <- 1)
    data$ex7 <- ifelse(regexpr("7. ex7", data$var) == -1, data$ex7 <- 0, data$ex7 <- 1)
    ...
    data$ex23 <- ifelse(regexpr("23. ex23", data$var) == -1, data$ex23 <- 0, data$ex23 <- 1)
    Le code fonctionne mais cela fait donc pas mal de lignes de code, tout en sachant que je dois répéter cette opération pour plusieurs variables.
    Une simple fonction "ifelse" avec pour condition une simple recherche de caractère (-1 si non présente).

    Y a t-il un moyen de concaténer tout ça en un seul code par variable (éventuellement, pour l'ensemble des variables) ?

  2. #2
    Membre éclairé
    Homme Profil pro
    Ingénieur de recherche
    Inscrit en
    Janvier 2012
    Messages
    325
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur de recherche
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Janvier 2012
    Messages : 325
    Points : 888
    Points
    888
    Par défaut
    Déjà commence par remplacer :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    data$ex1 <- ifelse(regexpr("1. ex1", data$var) == -1, data$ex1 <- 0, data$ex1 <- 1)
    par :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    data$ex1 <- ifelse(regexpr("1. ex1", data$var) == -1,  0, 1)
    Ce qui a déjà plus de sens.
    Il est possible de faire encore plus simple en utilisant le fait que TRUE vaut 1 et FALSE 0 :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    data$ex1 <- as.numeric(regexpr("1. ex1", data$var) != -1)
    Pour la boucle je vois pas où est le problème.

  3. #3
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2015
    Messages
    20
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 29
    Localisation : France, Val d'Oise (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2015
    Messages : 20
    Points : 4
    Points
    4
    Par défaut
    Cela se présente sous cette forme sur mon code. Les modifications / ajouts ayant été faites pour apporter plus de clarté comme indiqué plus haut. La seconde méthode est viable, je peux l'utiliser. J'y avais pensé mais pas pris la peine de rechercher plus loin sachant que ma 1ère méthode fonctionnait, merci.

    En ce qui concerne la boucle, le problème étant qu'en procédant ainsi, je devrais taper à la main plusieurs centaine de ligne de code.
    (plusieurs variables & sous variables).
    D'où ma demande, je ne sais pas s'il est possible à partir de cet exemple de créer une boucle qui me permettrais de créer une colonne pour chaque sous variables. Ainsi, je n'aurais pas besoin d'une ligne de code par sous variables, mais d'une seule par variable (qui traiterais donc toutes les sous variables d'un coup).

  4. #4
    Membre confirmé
    Inscrit en
    Mars 2013
    Messages
    208
    Détails du profil
    Informations forums :
    Inscription : Mars 2013
    Messages : 208
    Points : 461
    Points
    461
    Par défaut
    Hello,

    Tu peux tester ca:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
     
    #exemple de données
    data<-data.frame(var=c("1. ex1 ; 2. ex2","2. ex2 ; 5. ex5 ; 7. ex7")) 
    #définit prealablement les 'sous variables', il y a moyen d'automatiser cette definition si les modalités sont separées par un pattern identifable
    mod<-c("1. ex1", "2. ex2","3. ex3" , "5. ex5" , "7. ex7")
     
    fbin<-function(x,y=data$var){as.numeric(regexpr(x,y ) != -1)}
    data[,mod]<-sapply(mod,fbin)

  5. #5
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2015
    Messages
    20
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 29
    Localisation : France, Val d'Oise (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2015
    Messages : 20
    Points : 4
    Points
    4
    Par défaut
    Bonjour,

    Merci pour votre rapidité de réponse et pour ce code qui fonctionne parfaitement !
    Pour l'anecdote, il y a moyen de simplifier plus encore ce code puisqu'il existe effectivement une séparation identifiable.

    Ainsi, l'on aurait à la place de :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    mod<-c("1. ex1", "2. ex2","3. ex3" , "5. ex5" , "7. ex7")
    celui - ci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    mod<-c("1", "2", "3", "4", "5", "6", "7", ..., "23")

    J'ai plus ou moins saisie le fonctionnement de ce code mais je ne suis pas contre une explication globale de comment il fonctionne exactement si cela n'est pas trop demandé.
    Aussi, j'aimerais également savoir s'il est possible de renommer les sous variables automatiquement. Ceux - ci étant un code pour chacune des sous variables déjà prédéfini (ex1, ex2 ... sont plus long dans ma BDD).

    Et une dernière chose, y a t-il moyen d'ajouter des variables à ce code ? Ou faut - il le refaire systématiquement pour chacune d'entre elles ?
    Je vais regarder de mon côté là dessus si j'arrive à en retirer quelque chose.


    Encore merci pour ce travail.

  6. #6
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2015
    Messages
    20
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 29
    Localisation : France, Val d'Oise (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2015
    Messages : 20
    Points : 4
    Points
    4
    Par défaut
    J'ai la solution à ce que je voulais. J'ai agis naïvement mais cela fonctionne.

    Code pour le recodage : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    mod<-c(c("1", "2", "3", "4", "5", ..., "23"),
           c("1", "2", "3", "4", "5", ..., "8"), 
           c("1", "2", "3", "4", "5", ..., "12"),
           c("1", "2", "3", "4", "5", ..., "18"),
           c("1", "2", "3", "4", "5", ..., "12"),
           c("1", "2", "3", "4", "5", ..., "26"),
           c("1", "2", "3", "4", "5", ..., "38"),
    fbin<-function(x,y=c(data$var1, var2, var3, var4, var5, var6, var7)){as.numeric(regexpr(x,y) != -1)}
    data[,mod]<-sapply(mod,fbin)

    En procédant ainsi, mes variables prenaient plus ou moins les mêmes noms (1, 2, ...,23 ; 1.1, 2.1, ... 8.1 ; 1.2, 2.2 ... 12.1 ; ...)
    Etant donné qu'elles restent dans l'ordre du recodage, j'ai procédé de cette façon.

    Code pour le renommage : Sélectionner tout - Visualiser dans une fenêtre à part
    names(data)[90:136] <- c("nom1", "nom2", ...)


    Du coup, j'aurais toujours besoin d'une explication du fonctionnement de la fonction. Et s'il y a moyen de simplifier mon code, je suis preneur.

  7. #7
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2015
    Messages
    20
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 29
    Localisation : France, Val d'Oise (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2015
    Messages : 20
    Points : 4
    Points
    4
    Par défaut
    Désolé par avance pour ce 3ème post. J'ai cependant un problème en fin de compte dans ma table finale.

    En effet, le fait que l'identifiant (1, 2, 3 ...) soit similaire pour chacune de mes sous variables, cela fausse mes résultats. J'ai essayé avec une première variable, les résultats sont bons et dès l'ajout de la seconde, ils ne le sont plus.
    Du coup, soit il y a un moyen pour que mes variables soient isolées dans la boucle ... soit de refaire le code variable par variable.

  8. #8
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2015
    Messages
    20
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 29
    Localisation : France, Val d'Oise (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2015
    Messages : 20
    Points : 4
    Points
    4
    Par défaut
    Je sens qu'on va me donner des coups :3

    Finalement, problème résolu. J'ai simplement rajouté une ligne qui renomme mes sous variables pour éviter qu'elles ne soient écrasées.
    Et donc, j'ai fait ça variable par variable.

  9. #9
    Membre confirmé
    Inscrit en
    Mars 2013
    Messages
    208
    Détails du profil
    Informations forums :
    Inscription : Mars 2013
    Messages : 208
    Points : 461
    Points
    461
    Par défaut
    Citation Envoyé par Eliam Voir le message
    Du coup, j'aurais toujours besoin d'une explication du fonctionnement de la fonction. Et s'il y a moyen de simplifier mon code, je suis preneur.

    En fait je reprend ton code pour declarer une fonction fbin qui va prendre en entrée x un nom de modalité, et renvoyer si la modalité est présente ou non dans y (par défaut, y= la première variable).

    Ensuite, je declare autant de nouvelles colonnes au data frame qu'il y a de modalités

    Par exemple si on a:
    Faire:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    data$a<-c(1,2)
    data$b<-c(3,4)
    Reviens à faire

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    data[,mod]<-matrix(c(1,2,3,4),ncol=2)

    Or sapply applique fbin à chaque colonne de data[,mod], avec x qui varie dans l'ensemble des colonnes mod.
    Ca renvoit donc une matrice de binaires aux même dimensions que data[,mod], et on est bien dans le même cas que l'exemple illustratif ci dessus.



    En bidouillant un peu le paramètre y de fbin comme tu l'as déjà fais avec succès on dirait, on peut effectivement faire passer plusieurs variables d'un coup.

  10. #10
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2015
    Messages
    20
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 29
    Localisation : France, Val d'Oise (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2015
    Messages : 20
    Points : 4
    Points
    4
    Par défaut
    Bonjour,

    Désolé pour cette réponse un peu tardive, mais je tenais tout de même à vous remercier pour ces explications claires et concises.
    Voici un aperçu du code final, si cela peut intéresser quelqu'un un jour ou par simple curiosité.

    Comme dit plus haut, j'ai dû procéder variable par variable.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    mod_var1<-c("1", "2", "3", "4", "5", ..., "23")
    fbin<-function(x=mod_var1,y=data$var1){as.numeric(regexpr(x,y) != -1)}
    data[,mod_var1]<- sapply(mod_var1,fbin)
    names(data)[(length(data)-length(mod_var1)+1):(length(data))] <- c("nom1", "nom2", "nom3", ..., "nom23")   
     
    mod_var2<-c("1", "2", "3", "4", "5", ..., "8")
    fbin<-function(x=mod_var2,y=data$var2){as.numeric(regexpr(x,y) != -1)}
    data[,mod_var2]<- sapply(mod_var2,fbin)
    names(data)[(length(data)-length(mod_var2)+1):(length(data))] <- c("nom1.2", "nom2.2", "nom3.2", ..., "nom8.2")

    Je vais encore chercher un peu s'il y a un moyen de tout synthétiser en un seul et unique code. Encore merci en tout cas pour vos aides.

  11. #11
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2015
    Messages
    20
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 29
    Localisation : France, Val d'Oise (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2015
    Messages : 20
    Points : 4
    Points
    4
    Par défaut
    Bonjour,

    Après avoir regroupé l'ensemble de mes données, un problème se pose à moi. Celui - ci étant lié au fait que les identificateurs (1, 2, ...) sont strictement identiques. Ainsi, le codage de mes variables est mauvais.
    Je devais donc me résoudre à utiliser des identificateurs différents. Ce que j'ai essayé de faire mais R n'est pas assez puissant pour le faire d'après un message d'erreur.

    Je procéderais donc ainsi, variable par variable. Merci tout de même pour vos aides

  12. #12
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2015
    Messages
    20
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 29
    Localisation : France, Val d'Oise (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2015
    Messages : 20
    Points : 4
    Points
    4
    Par défaut
    Bonjour,

    Je me permets de relancer ce sujet, relativement récent, pour un problème quasi similaire.
    J'ai cette fois - ci un séparateur identifiable dans ma variable, le point virgule.

    Ainsi, celle - ci se présente ainsi sous Excel :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    nom1 ; nom2 ; nom3
    nom1
    nom4 ; nom7
    nom2 ; nom6
    nom1 ; nom2 ; nom4 ; nom5
    ...
    J'ai simplement besoin de créer une variable qui compte le nombre d’occurrence différente. Pour cela, j'ai voulu compter le nombre de ";" par observations auquel j'ajoute simplement 1.
    Mon problème étant que je ne sais pas comment je pourrais obtenir le nombre de ";" par observations. J'ai utilisé la fonction "gregexpr" qui me donne la position de chacun de ces ";", mais ce n'est pas ce qu'il me faut.

    Comment en arriver à ça :

Discussions similaires

  1. Réponses: 0
    Dernier message: 07/04/2013, 14h08
  2. Réponses: 3
    Dernier message: 24/09/2011, 02h08
  3. Réponses: 4
    Dernier message: 15/05/2010, 16h17
  4. utiliser une valeur float pour une boucle for
    Par didi59650 dans le forum Débuter
    Réponses: 6
    Dernier message: 18/04/2006, 17h32

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