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 :

boucle for sur un tableau


Sujet :

R

  1. #1
    Candidat au Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Juin 2015
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2015
    Messages : 8
    Points : 3
    Points
    3
    Par défaut boucle for sur un tableau
    Bonjour,
    je commence tout juste à utiliser R, et je ne suis pas très à l'aise.

    J'ai un tableau avec des noms de joueurs et leur temps et j'aimerais réaliser quelques opérations sur chacun des joueurs. Par exemple, j'aimerais calculer la médiane des temps pour chacun des joueurs et réduire l'intervalle des données que je prends (que j'ai nommé x1 et x2).
    J'ai fait le code suivant mais il réalise tous les calculs pour chaque ligne et non pas pour le bloc de lignes appartenant au même joueur :

    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
    for(v in unique(data$joueur)){
        sel<-data$joueur==v
        extraction<-data[sel, ]
        M<-median(extraction$temps)
        MAD<-absolue(extraction$temps,M)
        x1<-M-3*MAD
        x2<-M+3*MAD
        print(sprintf("intervalle  pour procede %s = %f et %f",v,x1,x2))}
     
    [1] "intervalle  pour procede sophie = 2.000000 et 2.000000" 
    [2] "intervalle  pour procede sophie = -2.440000 et 6.440000"
    [3] "intervalle  pour procede sophie = 2.000000 et 2.000000" 
    [1] "intervalle  pour procede m‚m‚ = 3.000000 et 3.000000" 
    [2] "intervalle  pour procede m‚m‚ = -1.440000 et 7.440000"
    [3] "intervalle  pour procede m‚m‚ = -1.440000 et 7.440000"
    [1] "intervalle  pour procede Ben = 2.000000 et 2.000000"
    [1] "intervalle  pour procede Benjamin = 0.280000 et 4.720000"
    [2] "intervalle  pour procede Benjamin = 0.280000 et 4.720000"
    [1] "intervalle  pour procede h‚loise = 1.000000 et 1.000000"
    [2] "intervalle  pour procede h‚loise = 1.000000 et 1.000000"
    J'aimerais qu'il me fasse les calculs que je lui dit pour chaque "bloc" de joueur... une idée ? De plus, une fois que l'intervalle pour chaque joueur sera bien déterminé, comment sélectionner que les lignes répondant à cette intervalle ?

    Merci pour vos réponses.

  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
    Ta boucle for fait bien les calculs "par bloc", c'est ton sprintf qui affiche plusieurs lignes car une ou plusieurs variables que tu lui donne n'est pas de longueur 1.

  3. #3
    Candidat au Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Juin 2015
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2015
    Messages : 8
    Points : 3
    Points
    3
    Par défaut
    Pourtant quand je ne fais pas de sprintf et que je lui demande juste de me retourner le xa par exemple, il m'en affiche autant qu'avec le sprintf..

  4. #4
    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
    C'est surement justement cette variable qui n'est pas de longueur 1.

    Enlève ta boucle for et initialise la variable v, puis execute le contenu de la boucle ligne par ligne en regardant le contenu de tes variables, le problème devrais te sauter aux yeux.

    Je pense que c'est la fonction absolue (?) qui renvoie pas ce que tu pense.

  5. #5
    Membre actif
    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
    Points : 296
    Points
    296
    Par défaut
    Bonjour,
    Comme vous l'a dit Theta, le souci se trouve certainement dans la fonction absolue.
    Par ailleurs, ceci est un exemple typique où les itérations explicites devraient être évitées: la famille des fonctions *apply et apparentées (split, by, etc.) est taillée sur mesure pour pareils cas (vectorisation).

    Code R : 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
    eg <- list(joueur = rep(letters[seq_len(5)], 2), temps = sample.int(10))
     
    données <- as.data.frame(eg, stringsAsFactors = FALSE)
     
    faireTraitements <- function(x) {
        y <- median(x$temps)
        #Mettre ici les instructions de la fonction "absolue"
        x1 <- y - 3 * mad(x$temps)
        x2 <- y + 3 * mad(x$temps)
        print(sprintf("(%f, %f)", x1, x2))
        return(list(x1, x2))
    }
     
    résultats <- by(données, données$joueur, faireTraitements)
     
    print(résultats)

    Pourriez-vous poster le code de cette fonction absolue ?
    Récemment, il y a eu une discussion sur comment "simplifier" les itérations.

  6. #6
    Candidat au Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Juin 2015
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2015
    Messages : 8
    Points : 3
    Points
    3
    Par défaut
    Bonjour,

    D'accord ! merci beaucoup !

    La fonction absolue était la suivant
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    absolue<- function(x,y)
    MAD=abs(x-y)*1.48
    return(MAD)

  7. #7
    Membre actif
    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
    Points : 296
    Points
    296
    Par défaut
    Bonjour,
    L'usage auquel vous réservez cette fonction "absolue" peut être remplacé par une méthode native en R, voir :
    En somme, il semble que vous essayez de faire quelque chose qui ressemble à ceci :
    Code R : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    faireTraitements <- function(x) {
        y <- median(x$temps)
        tmp <- 3 * mad(x$temps)
        x1 <- y - tmp
        x2 <- y + tmp
        cat(x$joueur, " = (", x1, ", ", x2, ")\n", sep = "")
        return(list(x1 = x1, x2 = x2))
    }
     
    eg <- list(joueur = rep(letters[seq_len(5)], 2), temps = sample.int(10))
    données <- as.data.frame(eg, stringsAsFactors = FALSE)
    résultats <- by(données, données$joueur, faireTraitements)
    print(résultats)

  8. #8
    Candidat au Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Juin 2015
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2015
    Messages : 8
    Points : 3
    Points
    3
    Par défaut
    C'est parfait ça marche super bien ! Merci beaucoup !

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

Discussions similaires

  1. [XL-2007] Boucle for sur Tableau volumineux
    Par meolimo dans le forum Excel
    Réponses: 6
    Dernier message: 14/11/2014, 15h46
  2. [BASH] boucle for sur des fichiers, recuperation du chemin ?
    Par zevince dans le forum Shell et commandes GNU
    Réponses: 13
    Dernier message: 13/11/2007, 10h47
  3. Boucle for sur fichiers sauf un !
    Par coincoin22 dans le forum Linux
    Réponses: 4
    Dernier message: 13/08/2007, 14h41
  4. Réponses: 15
    Dernier message: 11/05/2007, 15h28
  5. [Eval] Problème de boucle for sur des tableaux
    Par battle_benny dans le forum Général JavaScript
    Réponses: 3
    Dernier message: 12/01/2006, 23h55

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