Groupes de colonnes identiques

Postez ici vos questions, réponses, commentaires ou suggestions - Les sujets seront ultérieurement répartis dans les archives par les modérateurs

Modérateur : Groupe des modérateurs

Mallory Cals
Messages : 6
Enregistré le : 15 Avr 2020, 12:33

Groupes de colonnes identiques

Messagepar Mallory Cals » 14 Mai 2020, 13:41

Bonjour,

J'ai le data frame suivant :

A B C D E F
1 1 0 0 1 1
0 0 1 0 0 0
0 0 0 1 0 0
9 9 0 0 9 9
1 1 1 1 1 1

Et je souhaiterais ressortir des groupes de colonnes qui sont identiques (position des valeurs importante)
Exemple : les colonnes A, B, E et F forment un groupe

La fonction setdiff ne fonctionne pas car elle ne prends pas en compte la position des valeurs.

Merci d'avance

Mickael Canouil
Messages : 1315
Enregistré le : 04 Avr 2011, 08:53
Contact :

Re: Groupes de colonnes identiques

Messagepar Mickael Canouil » 14 Mai 2020, 13:46

Bonjour,

Votre "data.frame' (en l'occurrence du texte brute et non un data.frame), n'a pas le même nombre d'élements dans chaque ligne.

Pourriez-lire les messages suivants et ainsi produire un un jeu de données exploitable dans R ?

Cordialement,
Mickaël
mickael.canouil.fr | rlille.fr

Mickael Canouil
Messages : 1315
Enregistré le : 04 Avr 2011, 08:53
Contact :

Re: Groupes de colonnes identiques

Messagepar Mickael Canouil » 14 Mai 2020, 14:09

Code : Tout sélectionner

dta <- data.frame(
  
letters,
  
LETTERS,
  
LETTERS,
  
sprintf("%02d"1:26),
  
letters,
  
sprintf("%02d"1:26)


Pour retirer les colonnes dupliquées.

Code : Tout sélectionner

dta[, !duplicated(as.list(dta))] 


Une approche affreuse et pas très performante avec dplyr pour regrouper les colonnes.

Code : Tout sélectionner

library(dplyr)
library(tibble)
dta %>% 
  
t() %>% 
  
data.frame() %>% 
  
rownames_to_column("id") %>%
  
group_by_at(.vars vars(starts_with("X"))) %>% 
  
summarise(id paste(idcollapse "/")) %>% 
  
ungroup() %>% 
  
column_to_rownames("id") %>%
  
t() %>% 
  as.
data.frame()
#>     d/f a/e b/c
#> X1   01   a   A
#> X2   02   b   B
#> X3   03   c   C
#> X4   04   d   D
#> X5   05   e   E
#> X6   06   f   F
#> X7   07   g   G
#> X8   08   h   H
#> X9   09   i   I
#> X10  10   j   J
#> X11  11   k   K
#> X12  12   l   L
#> X13  13   m   M
#> X14  14   n   N
#> X15  15   o   O
#> X16  16   p   P
#> X17  17   q   Q
#> X18  18   r   R
#> X19  19   s   S
#> X20  20   t   T
#> X21  21   u   U
#> X22  22   v   V
#> X23  23   w   W
#> X24  24   x   X
#> X25  25   y   Y
#> X26  26   z   Z 
Mickaël
mickael.canouil.fr | rlille.fr

Gabriel Terraz
Messages : 591
Enregistré le : 26 Sep 2011, 15:11

Re: Groupes de colonnes identiques

Messagepar Gabriel Terraz » 14 Mai 2020, 15:08

Je pense te proposer plus simple.

Tu commences par transformer tes colonnes en chaines de caractères, qui seront plus simples à comparer.
En partant de ton exemple :

Code : Tout sélectionner

ex1 <- structure(list(A = c(1L, 0L, 0L, 9L, 1L), B = c(1L, 0L, 0L, 9L,
1L), C = c(0L, 1L, 0L, 0L, 1L), D = c(0L, 0L, 1L, 0L, 1L), E = c(1L,
0L, 0L, 9L, 1L), F = c(1L, 0L, 0L, 9L, 1L)), .Names = c("A",
"B", "C", "D", "E", "F"), class = "data.frame", row.names = c(NA,
-5L)
ex1_paste <- sapply(ex1, paste, collapse = "")


Et donc les groupes correspondants à tes colonnes :

Code : Tout sélectionner

as.numeric(factor(ex1_paste))
[1] 3 3 2 1 3 3

Mickael Canouil
Messages : 1315
Enregistré le : 04 Avr 2011, 08:53
Contact :

Re: Groupes de colonnes identiques

Messagepar Mickael Canouil » 14 Mai 2020, 16:21

@Gabriel J'ai pensé à la même chose après, mais j'aurai mis un séparateur "exotique", c'est-à-dire, qui ne peut pas exister en tant que valeur dans l'une des cellules, par exemple collapse = "_-_".
Mickaël
mickael.canouil.fr | rlille.fr

François Bonnot
Messages : 537
Enregistré le : 10 Nov 2004, 15:19
Contact :

Re: Groupes de colonnes identiques

Messagepar François Bonnot » 15 Mai 2020, 07:24

Bonjour,
Une suggestion (à partir de l'objet ex1 ci-dessus) :

Code : Tout sélectionner

d <- dist(t(ex1))
u <- unique(as.matrix(d)==0)
apply(u,1,function(i) colnames(u)[i])
François

Gabriel Terraz
Messages : 591
Enregistré le : 26 Sep 2011, 15:11

Re: Groupes de colonnes identiques

Messagepar Gabriel Terraz » 15 Mai 2020, 07:41

Mickael,
Je ne suis pas certain que cela change quelque chose de prendre un séparateur, à part faciliter la lecture des chaines de caractères collées, mais a priori, ce n'est pas nécessaire, non ?

Logez Maxime
Messages : 3138
Enregistré le : 26 Sep 2006, 11:35

Re: Groupes de colonnes identiques

Messagepar Logez Maxime » 15 Mai 2020, 13:27

Bonjour,

le séparateur exotique peut éviter ce genre de confusion : 9, 99 contre 99, 9 qui serait identique sans séparateur.
Une alternative a factor :

Code : Tout sélectionner

match(ex1_paste, unique(ex1_paste))
[1] 1 1 2 3 1 1
Cordialement,
Maxime

Gabriel Terraz
Messages : 591
Enregistré le : 26 Sep 2011, 15:11

Re: Groupes de colonnes identiques

Messagepar Gabriel Terraz » 15 Mai 2020, 13:42

Effectivement, je n'avais pas du tout pensé à ce cas là, merci Maxime


Retourner vers « Questions en cours »

Qui est en ligne

Utilisateurs parcourant ce forum : Aucun utilisateur enregistré et 1 invité