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 :

R comparaison de valeurs par groupe


Sujet :

R

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Homme Profil pro
    Inscrit en
    Décembre 2008
    Messages
    50
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Vaucluse (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Décembre 2008
    Messages : 50
    Par défaut R comparaison de valeurs par groupe
    Bonsoir.
    Dans une dataframe groupée je cherche si des valeurs d'une colonne sont présentes dans une autre colonne pour chaque groupe indépendamment bien sûr.
    Voici in exemple factice et simplifié de mes données :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    df <- data.frame()
    for (i in 1:4) {
     for (j in 1:4) {
       x <- sample(1:12,4)
       y <- sample(1:12,4)
       gr <- i
       x <- cbind(gr,x,y)
     } 
      df <- rbind(df,x)
    }
    df <- df %>% group_by(gr)
    Voici le résultat attendu :
      gr x1 x2 x3 x4
      1  1  1  0  0
      2  0  0  1  0
      3  1  1  0  0
      4  0  0  0  1
    Je pourrais le faire avec une boucle :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    pre <- unique(df$gr)
    result <- data.frame()
    for (i in pre) {
      tmp <- df %>% filter(gr == i)
      result <- rbind(result,as.integer(tmp$x %in% tmp$y ))
    }
    result <- cbind(pre,result)
    names(result) <- c("gr","x1","x2","x3","x4")
    mais je suis sur que c'est faisable avec quelque chose de la famille des apply. Mon problème c'est que j'ai beau triturer tout cela dans tous les sens, je ne m'en sort pas. Un peu d'aide serait la bienvenue.
    Merci

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

    Informations forums :
    Inscription : Janvier 2006
    Messages : 491
    Par défaut
    bonjour ,
    une solution avec le tidyverse et purrr, mais honnêtement ça n'apporte pas grand chose, je pense qe l'on peux faire mieux

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    library(tidyverse)
    library(purrr)
    ...
    comparer <- function(groupe){
      tmp <- df %>% filter(gr == groupe) 
     enframe (as.integer(tmp$x %in% tmp$y )) %>% spread(name,value)
    }
    #res <- map(unique(df$gr),comparer) %>% reduce(bind_rows)   ##  map fonction équivalente à apply
    # mieux
    res <- map_df(unique(df$gr),comparer) 
    ...
    cdlt

  3. #3
    Membre averti
    Homme Profil pro
    Inscrit en
    Décembre 2008
    Messages
    50
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Vaucluse (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Décembre 2008
    Messages : 50
    Par défaut
    Merci pour la proposition. En effet ça ne semble pas être très efficace mais c'est tout de même bien plus élégant que mes boucles.
    Il me semble que group_map serait pertinent mais je coince sur l'utilisation et je ne trouve pas d’exemple qui me soit compréhensible...

  4. #4
    Membre averti
    Homme Profil pro
    Inscrit en
    Décembre 2008
    Messages
    50
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Vaucluse (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Décembre 2008
    Messages : 50
    Par défaut
    Citation Envoyé par yalehaire Voir le message
    Merci pour la proposition. En effet ça ne semble pas être très efficace mais c'est tout de même bien plus élégant que mes boucles.
    Il me semble que group_map serait pertinent mais je coince sur l'utilisation et je ne trouve pas d’exemple qui me soit compréhensible...
    Eureka! J'ai trouvé.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    fcomparer <- function(df,...){
      as.data.frame(t(as.integer(df$x %in% df$y )))
    }
    res <- df %>% group_map(fcomparer)
    5.4 secondes pour traiter 11441 groupes.
    Difficile de faire plus simple il me semble.
    Merci de votre attention.

  5. #5
    Membre émérite
    Homme Profil pro
    Inscrit en
    Janvier 2006
    Messages
    491
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Corse (Corse)

    Informations forums :
    Inscription : Janvier 2006
    Messages : 491
    Par défaut
    encore plus simple

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    res <- map_df(split(df,df$gr),~enframe(as.integer(.x$x %in% .x$y )) %>% spread(name,value))

  6. #6
    Membre averti
    Homme Profil pro
    Inscrit en
    Décembre 2008
    Messages
    50
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Vaucluse (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Décembre 2008
    Messages : 50
    Par défaut
    Plus simple mais beaucoup moins rapide :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    system.time : 
    utilisateur     système      écoulé 
          31.74        0.01       33.06
    contre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    system.time : 
    utilisateur     système      écoulé 
           7.52        0.00        7.83
    pour le même jeu de données.

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

Discussions similaires

  1. [XL-97] Comparaison de valeur par rapport à une référence et insertion d'un statut OK ou NOK
    Par Kartoon67 dans le forum Macros et VBA Excel
    Réponses: 9
    Dernier message: 27/05/2009, 09h22
  2. group by et valeur par defaut
    Par xian21 dans le forum Requêtes
    Réponses: 2
    Dernier message: 12/03/2009, 16h45
  3. Réponses: 10
    Dernier message: 30/10/2008, 14h06
  4. regrouper par groupe de valeur
    Par papilou86 dans le forum IHM
    Réponses: 2
    Dernier message: 23/01/2008, 21h16
  5. Réponses: 10
    Dernier message: 07/12/2006, 20h52

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