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 :

Créer une boucle [Débutant(e)]


Sujet :

R

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Femme Profil pro
    Étudiant
    Inscrit en
    Octobre 2011
    Messages
    84
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Tourisme - Loisirs

    Informations forums :
    Inscription : Octobre 2011
    Messages : 84
    Par défaut Créer une boucle
    Bonjour,
    Je dispose d'un data frame: "NO", pour lequel j'effectue une opération :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    AL <- which (NO[2] > 0)
    > ALstart <- NO[AL,2]
    > print(NO[[1]] [min(AL)])
    [1] "2010-07-01 18:00:00"
    Je cherche donc à connaitre les valeurs positives de ma seconde colonne, à les mettre dans un objet, et à connaitre le contenu de la première colonne associée à la première valeur positive.
    Maintenant, j'aimerais effectuer cette même opération pour toutes les colonnes suivantes de mon data frame: NO[3:16] .
    Pour information :
    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
    > str(NO)
    'data.frame':   3983 obs. of  16 variables:
     $ dates: POSIXlt, format: "2009-12-15 12:00:00" "2009-12-15 15:00:00" "2009-12-15 18:00:00" "2009-12-15 21:00:00" ...
     $ 0.3  : num  -7.33 -7.78 -8 -8.41 -8.85 ...
     $ 0.5  : num  -7.09 -7.4 -7.5 -7.66 -7.85 -8.09 -8.36 -8.61 -8.83 -8.99 ...
     $ 0.7  : num  -7 -7.25 -7.28 -7.35 -7.44 -7.56 -7.7 -7.86 -8.02 -8.17 ...
     $ 0.9  : num  -6.91 -7.13 -7.15 -7.18 -7.23 -7.28 -7.35 -7.44 -7.53 -7.63 ...
     $ 1.1  : num  -6.82 -7.05 -7.09 -7.09 -7.12 -7.15 -7.18 -7.23 -7.28 -7.35 ...
     $ 1.4  : num  -6.77 -7.01 -7.04 -7.04 -7.05 -7.08 -7.09 -7.11 -7.14 -7.17 ...
     $ 1.7  : num  -6.74 -6.98 -6.97 -7 -7.01 -7.01 -7.04 -7.05 -7.07 -7.08 ...
     $ 2    : num  -6.78 -7.05 -7.05 -7.06 -7.08 -7.08 -7.11 -7.12 -7.15 -7.15 ...
     $ 2.5  : num  -6.61 -6.91 -6.91 -6.95 -6.97 -7.01 -7.02 -7.05 -7.08 -7.14 ...
     $ 3    : num  -5.69 -5.92 -5.92 -5.92 -5.92 -5.95 -5.95 -5.95 -5.97 -5.99 ...
     $ 4    : num  -4.75 -4.91 -4.9 -4.91 -4.94 -4.94 -4.94 -4.94 -4.94 -4.94 ...
     $ 5    : num  -4.15 -4.32 -4.32 -4.32 -4.32 -4.32 -4.32 -4.32 -4.34 -4.35 ...
     $ 7    : num  -3.78 -3.91 -3.91 -3.91 -3.91 -3.91 -3.91 -3.91 -3.91 -3.91 ...
     $ 9    : num  -3.93 -4.02 -4.02 -4.02 -4.02 -4.02 -4.02 -4.02 -4.02 -4.02 ...
     $ 10   : num  -4 -4.12 -4.12 -4.11 -4.11 -4.11 -4.11 -4.11 -4.11 -4.12 ...
    >
    J'ai donc pensé faire une boucle mais j'ai quelques difficultés à la formuler.
    J'ai essayé avec "if", dans l'idée que si ma ligne est négative je passe à la suivante, sinon je m'arrête (utilisation de "stop()???) et je crée mon objet contenant mes valeurs positives. Mais cela ne semble pas fonctionner :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    i <- 2
    		if(NO[i,2] > 0){
    			AL <- which (NO[2] > 0)
    			ALstart <- NO[AL,2]
    			print(NO[[1]] [min(AL)])
    		}else{ 
    			i <- i+1
    			}
    Ensuite, cette boucle ne teste que les valeurs de la seconde colonne, or j'aimerais que, quand celles-ci sont testées, les valeurs positives trouvées et la valeur associée à la première est donnée, passer à la colonne suivante et faire la même chose.

    J'ai essayé "apply", mais je l'utilise mal.
    Ou alors "for" ou "while" :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    i <- 2
    j <- 2
     
    	while(j < 16){   # 16: nb colonnes
    		while(i < 1389){   # 1389 nb lignes
    			if(NO[i,j]<0){ ....

    J'imagine que plusieurs solutions sont envisageables, le problème est de correctement remplir ces fonctions pour qu'elles fonctionnent...
    Pourriez-vous donc m'aider à convertir le premier code en boucle, qui pour chaque colonne de mon data frame (à partir de la seconde), crée un objet contenant les valeurs positives, et me donne la valeur de la première colonne de la première de celle-ci??
    Merci pour une aide éventuelle :-)

  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,

    Donc si j'ai bien compris, vous cherchez à récupérer, pour chaque colonne, les valeurs positives et les dates qui leur sont associées, c'est bien cela?

    Je pense que le code suivant fait cela (après il vous faudra peut-être l'adapter un peu) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    # fonction permettant de récupérer les valeurs positives d'un vecteur (= une colonne) et les dates associées :
    
    test_positive<-function(v,col1=NO[,1])
    {
       pos<-which(v>0)
       s<-data.frame(col1[pos],v[pos])
       return(s)
    }
    
    # on applique cette fonction à toutes les colonnes de 3 à 16 :
    
    L<-lapply(NO[,3:16],test_positive)
    
    # L est une liste dont chaque élément correspond aux valeurs positives et dates associées d'une colonne de NO
    En espérant que ceci vous aide à avancer, 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é
    Femme Profil pro
    Étudiant
    Inscrit en
    Octobre 2011
    Messages
    84
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Tourisme - Loisirs

    Informations forums :
    Inscription : Octobre 2011
    Messages : 84
    Par défaut
    Et bien merci, car la première partie de ce code semble être en effet adaptée à ma demande avec un peu d'adaptation.
    Seulement, la seconde partie me retourne un message d'erreu r:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    > L<-apply(NO[,3:16],test_positive)
    Erreur dans is.function(FUN) : 'FUN' est manquant
    et comme j'ai déjà eu du mal avec "apply" lorsque j'ai essayé de le faire moi-même, j'ai là encore des difficultés à régler le problème avec "apply(X, MARGIN, FUN, ...)"

    Le "FUN" n'est-il pas censé être "test_positive"? Quelque chose doit alors manquer avant?

  4. #4
    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
    Pardon, une petite erreur de frappe :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    L<-lapply(NO[,3:16],test_positive)

    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.

  5. #5
    Membre confirmé
    Femme Profil pro
    Étudiant
    Inscrit en
    Octobre 2011
    Messages
    84
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Tourisme - Loisirs

    Informations forums :
    Inscription : Octobre 2011
    Messages : 84
    Par défaut
    Oui en effet ça me rend bien une liste désormais!!! :-D
    Et je vous en remercie. Seulement, cette liste d'éléments m'est peu commode. Y-a-t'il un moyen de la convertir en data.frame à l'image du "s" dans:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    s<-data.frame(col1[pos],v[pos])
    afin d'obtenir une structure similaire à mon data frame original mais seulement avec les valeurs positives?

  6. #6
    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
    Je ne comprends pas bien le format que vous cherchez à obtenir.
    En effet, si pour chaque colonne vous avez des valeurs positives à des dates différentes, comment faites-vous? Vous garder le tout? Ou bien vous voulez simplement mettre "bout à bout" tous les éléments de la liste obtenue avec le "lapply"?

    Une idée de piste sinon :

    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
    # fonction pour récupérer les coordonnées des éléments positifs d'un vecteur (= une colonne) :
     
    coord_positives<-function(v)
    {
    	u<-which(v>0)
    	return(u)
    }
     
    # S va contenir une liste dont chaque élément contiendra les coordonnées des éléments positifs de chaque colonne :
     
    S<-apply(NO[,2:6],2,coord_positives)
     
     
    # la transformation suivante va mettre bout à bout tous les éléments de la liste S précédemment créée (unlist) et en supprimer les doublons (unique) :
     
    L<-unique(unlist(S))
     
    # la transformation suivante va organiser les éléments de L du plus petit au plus grand :
     
    L<-sort(L)
     
     
    # la matrice OUT contiendra toutes les dates pour lesquelles il y a au moins une colonne positive :
     
    OUT<-NO[L,]

    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.

Discussions similaires

  1. Comment faire pour créer une boucle ?
    Par Arko76 dans le forum Algorithmes et structures de données
    Réponses: 3
    Dernier message: 02/04/2007, 17h14
  2. [XSLT] Comment créer une boucle
    Par Kefass dans le forum XSL/XSLT/XPATH
    Réponses: 7
    Dernier message: 28/02/2007, 21h57
  3. [PHP-JS] Comment créer une boucle avec des headers
    Par djinnwatcher dans le forum Langage
    Réponses: 10
    Dernier message: 17/07/2006, 15h48
  4. Comment créer une boucle ?
    Par kikica dans le forum Langage
    Réponses: 5
    Dernier message: 15/03/2006, 21h02
  5. [XSLT]créer une boucle
    Par fraoustin dans le forum XSL/XSLT/XPATH
    Réponses: 3
    Dernier message: 11/01/2005, 14h13

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