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 :

data.frame en paramètre dans une boucle


Sujet :

R

  1. #1
    Membre actif
    Inscrit en
    Novembre 2003
    Messages
    549
    Détails du profil
    Informations forums :
    Inscription : Novembre 2003
    Messages : 549
    Points : 243
    Points
    243
    Par défaut data.frame en paramètre dans une boucle
    Bonjour,
    Je souhaite faire une recherche dans plusieurs data.frame qui contiennent tous une variable Nom. Il me semble qu'une boucle for pourrait être appropriée, mais ça plante.
    Exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    for (i in c('T1','T2','T3','T4','T5')) {
       if ( !('XXX' %in% i[['Nom']]) ) cat("la table",i,"ne contient pas XXX\n")
    }
    Le message d'erreur est Error in i[["Nom"]] : indice hors limites

    Est-ce que quelqu'un saurait faire ça ?

  2. #2
    Membre éclairé
    Homme Profil pro
    Inscrit en
    Janvier 2006
    Messages
    481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Corse (Corse)

    Informations forums :
    Inscription : Janvier 2006
    Messages : 481
    Points : 836
    Points
    836
    Par défaut
    avec names(i)

  3. #3
    Membre actif
    Inscrit en
    Novembre 2003
    Messages
    549
    Détails du profil
    Informations forums :
    Inscription : Novembre 2003
    Messages : 549
    Points : 243
    Points
    243
    Par défaut
    Citation Envoyé par xavier-Pierre Voir le message
    avec names(i)
    Bonjour,
    Je ne suis pas sur de bien savoir l'utiliser. Exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    T1 <- data.frame(A=c(1,2,3,4,5,6,7),B=c(3,6,0,3,5,2,4))
    T2 <- data.frame(A=c(1,5,7,4,9,6,7),B=c(3,6,0,3,5,2,4))
    T3 <- data.frame(A=c(1,0,3,4,5,6,8),B=c(3,6,0,3,5,2,4))
    for (i in c('T1','T2','T3')) if ( 7 %in% names(i)[['A']] ) cat("la table",i,"contient 7\n")
    Ici, le programme n'imprime pas T1 et T2, alors que T1$A et T2$A contiennent tous deux 7 !

  4. #4
    Expert confirmé
    Avatar de olivier.decourt
    Homme Profil pro
    Formateur R/SAS/statistiques
    Inscrit en
    Avril 2008
    Messages
    2 064
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France

    Informations professionnelles :
    Activité : Formateur R/SAS/statistiques
    Secteur : Conseil

    Informations forums :
    Inscription : Avril 2008
    Messages : 2 064
    Points : 4 478
    Points
    4 478
    Par défaut
    Bonjour.
    J'ai décomposé un peu le problème : la fonction which permet de savoir si une valeur est présente dans une colonne, et où. Combinée à la fonction any, on sait si la valeur est présente au moins une fois. Si on applique ensuite la combinaison any+which à chaque colonne d'une table, via un sapply par exemple, on peut savoir si la valeur est présente au moins une fois sur l'ensemble des colonnes d'une table (avec un any là encore). Enfin la boucle permet de passer des tables en revue (liste de noms de tables qu'on pourrait récupérer avec ls() par exemple).
    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
    T1 <- data.frame(A=c(1,2,3,4,5,6,7),B=c(3,6,0,3,5,2,4))
    T2 <- data.frame(A=c(1,5,7,4,9,6,7),B=c(3,6,0,3,5,2,4))
    T3 <- data.frame(A=c(1,0,3,4,5,6,8),B=c(3,6,0,3,5,2,4))
     
    colonne_contient <- function(col, valeur){
      any(which(col == valeur))
    }
    df_contient <- function(df, valeur){
      any(sapply(get(df),
                 colonne_contient,
                 valeur))
    }
     
     
    for (i in c('T1','T2','T3')) {
      if (df_contient(i,7)) cat("la table",i,"contient 7\n")
    }

  5. #5
    Membre actif
    Inscrit en
    Novembre 2003
    Messages
    549
    Détails du profil
    Informations forums :
    Inscription : Novembre 2003
    Messages : 549
    Points : 243
    Points
    243
    Par défaut
    Citation Envoyé par olivier.decourt Voir le message
    Bonjour.
    J'ai décomposé un peu le problème : la fonction which permet de savoir si une valeur est présente dans une colonne, et où. Combinée à la fonction any, on sait si la valeur est présente au moins une fois. Si on applique ensuite la combinaison any+which à chaque colonne d'une table, via un sapply par exemple, on peut savoir si la valeur est présente au moins une fois sur l'ensemble des colonnes d'une table (avec un any là encore). Enfin la boucle permet de passer des tables en revue (liste de noms de tables qu'on pourrait récupérer avec ls() par exemple).
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    colonne_contient <- function(col, valeur){ any(which(col == valeur)) }
    df_contient <- function(df, valeur){ any(sapply(get(df), colonne_contient, valeur)) }
    for (i in c('T1','T2','T3')) { if (df_contient(i,7)) cat("la table",i,"contient 7\n") }
    En regardant ton code, j'ai repris en utilisant uniquement la fonction get(...) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    for (i in c('T1','T2','T3')) if ( 7 %in% get(i)[['A']] ) cat("la table",i,"contient 7\n")
    Ça semble fonctionner ... du moins pour mon souci à l'origine de ma question.

Discussions similaires

  1. Paramètre dans une boucle while
    Par fendry dans le forum Langage
    Réponses: 6
    Dernier message: 17/05/2014, 00h13
  2. sub avec paramétre dans une boucle
    Par gastoncs dans le forum VB.NET
    Réponses: 1
    Dernier message: 23/12/2011, 14h58
  3. Objet paramétré dans une boucle
    Par CedricMoi dans le forum Macros et VBA Excel
    Réponses: 4
    Dernier message: 05/02/2009, 10h21
  4. pause de durée paramètrable dans une boucle
    Par atomicJo dans le forum C++
    Réponses: 14
    Dernier message: 12/11/2007, 23h06
  5. [bash]Modification de paramètres dans une boucle
    Par troumad dans le forum Shell et commandes GNU
    Réponses: 18
    Dernier message: 28/10/2007, 16h05

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