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

  1. #1
    Membre actif
    Inscrit en
    Janvier 2003
    Messages
    604
    Détails du profil
    Informations forums :
    Inscription : Janvier 2003
    Messages : 604
    Points : 247
    Points
    247
    Par défaut Basculement d'un tableau de distance en matrice pour faire une représentation en dendrogramme via hclust
    Bonjour,
    J'ai généré une distance de similarité entre texte grâce à la fonction "pairwise similarity" qui me fournit un data.frame sur 3 colonnes:

    item1 item2 similarity
    Benoît François 0,0418411724
    Benoît Marine 0,0418253988
    Benoît Jean-Luc 0,0410565534
    Benoît Emmanuel 0,0393344223
    Benoît Nicolas 0,0368840665
    Benoît Jacques 0,0239595689
    Benoît François 0,0225942804
    Benoît Jean 0,021960521
    Benoît Philippe 0,0182790387
    Benoît Nathalie 0,0172037347
    ...

    J'aimerais faire une Classfication Hierarchique Ascendante dessus.
    Seulement en général la fonction hclust (qui fait cela) nécessite une matrice de distance de ce type pour intégrer les données.

    Nom : Capture d’écran 2020-06-22 à 22.25.32.png
Affichages : 201
Taille : 43,3 Ko



    Y a t'il un moyen par une fonction R de générer cette matrice ? (j'ai commencé une routine de parcours de mes enregs mais ça ne fonctionne pas)
    Merci de vos idées.

  2. #2
    Membre du Club
    Homme Profil pro
    Formateur et consultant R
    Inscrit en
    Juin 2020
    Messages
    36
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Formateur et consultant R
    Secteur : Conseil

    Informations forums :
    Inscription : Juin 2020
    Messages : 36
    Points : 69
    Points
    69
    Par défaut
    Bonjour,

    Je tente de reproduire vos données avec un exemple. Je pars du principe qu'il n'y a pas à la fois le couple "Benoit - François" et "François - Benoit".

    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
    library(dplyr)
    library(tidyr)
     
    # creation de donnees reproductibles
    my_data <- t(combn(letters[1:5], m = 2)) %>% 
      as.data.frame() %>% 
      rename(item1 = V1, item2 = V2) %>% 
      mutate(similarity = runif(n()))
     
    my_data
    #>    item1 item2 similarity
    #> 1      a     b 0.54330428
    #> 2      a     c 0.36558156
    #> 3      a     d 0.21660107
    #> 4      a     e 0.80978281
    #> 5      b     c 0.84192376
    #> 6      b     d 0.89579873
    #> 7      b     e 0.51401129
    #> 8      c     d 0.06428691
    #> 9      c     e 0.20805559
    #> 10     d     e 0.29695351
    # pivot des données

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    my_data %>% 
      pivot_wider(names_from = item2, values_from = similarity)
    #> # A tibble: 4 x 5
    #>   item1      b      c       d     e
    #>   <chr>  <dbl>  <dbl>   <dbl> <dbl>
    #> 1 a      0.543  0.366  0.217  0.810
    #> 2 b     NA      0.842  0.896  0.514
    #> 3 c     NA     NA      0.0643 0.208
    #> 4 d     NA     NA     NA      0.297
    # Si jamais vous n'avez pas entré vos données dans l'ordre alphanumeric, à savoir item2 > item1
    # vous pouvez le refaire

    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
    my_data %>% 
      rowwise() %>% 
      mutate(
        item_min = min(item1, item2),
        item_max = max(item1, item2)
      ) %>% 
      select(-item1, -item2) %>% 
      pivot_wider(names_from = item_max, values_from = similarity)
    #> # A tibble: 4 x 5
    #>   item_min      b      c       d     e
    #>   <chr>     <dbl>  <dbl>   <dbl> <dbl>
    #> 1 a         0.543  0.366  0.217  0.810
    #> 2 b        NA      0.842  0.896  0.514
    #> 3 c        NA     NA      0.0643 0.208
    #> 4 d        NA     NA     NA      0.297
    # Ou dans l'autre sens pour la diagonale en bas
    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
    my_data %>% 
      rowwise() %>% 
      mutate(
        item_min = min(item1, item2),
        item_max = max(item1, item2)
      ) %>% 
      select(-item1, -item2) %>% 
      pivot_wider(names_from = item_min, values_from = similarity)
    #> # A tibble: 4 x 5
    #>   item_max     a      b       c      d
    #>   <chr>    <dbl>  <dbl>   <dbl>  <dbl>
    #> 1 b        0.543 NA     NA      NA    
    #> 2 c        0.366  0.842 NA      NA    
    #> 3 d        0.217  0.896  0.0643 NA    
    #> 4 e        0.810  0.514  0.208   0.297
    <sup>Created on 2020-06-22 by the [reprex package](https://reprex.tidyverse.org) (v0.3.0)</sup>

  3. #3
    Membre actif
    Inscrit en
    Janvier 2003
    Messages
    604
    Détails du profil
    Informations forums :
    Inscription : Janvier 2003
    Messages : 604
    Points : 247
    Points
    247
    Par défaut
    Merci bien, c'est super cette fonction. Et cool aussi le fonctionnement de "reprex".
    Bonne journée.

  4. #4
    Membre confirmé
    Inscrit en
    Février 2011
    Messages
    276
    Détails du profil
    Informations forums :
    Inscription : Février 2011
    Messages : 276
    Points : 561
    Points
    561
    Par défaut
    Bonjour,

    une autre possibilité :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    as.dist(xtabs(similarity ~ item2 + item1, my_data))
    Cordialement

  5. #5
    Membre actif
    Inscrit en
    Janvier 2003
    Messages
    604
    Détails du profil
    Informations forums :
    Inscription : Janvier 2003
    Messages : 604
    Points : 247
    Points
    247
    Par défaut
    Super efficace. Merci bien.

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

Discussions similaires

  1. problème pour faire une matrice c++
    Par max17 dans le forum C++
    Réponses: 6
    Dernier message: 30/11/2015, 20h24
  2. [XL-2013] Utilisation d'un tableau pour faire une pyramide des ages
    Par bdathis dans le forum Excel
    Réponses: 2
    Dernier message: 16/09/2014, 09h44
  3. Réponses: 4
    Dernier message: 03/12/2009, 11h50
  4. Réponses: 11
    Dernier message: 20/07/2009, 11h22
  5. Utiliser un tableau de résultat pour faire une jointure
    Par Xavier1979 dans le forum MS SQL Server
    Réponses: 1
    Dernier message: 13/06/2007, 13h27

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