[RÉSOLU] Supprimer un certain nombre de doublons

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

Leslie Jannin
Messages : 3
Enregistré le : 18 Mai 2021, 14:43

[RÉSOLU] Supprimer un certain nombre de doublons

Messagepar Leslie Jannin » 19 Mai 2021, 09:27

Hello,

Je me forme depuis peu de temps à R, et j'ai encore du mal avec certains concepts.

J'ai deux dataset (ici fictifs): Un premier avec une simple liste de mots

Code : Tout sélectionner

   word
1  avance
2  bien
3  bien
4  bien
5  bon
6  mal

Et un second avec des paires de mots

Code : Tout sélectionner

      word          first         second
1  arrive pas       arrive         pas
2  pas bien         pas            bien
3  bien sûr         bien           sûr
4  sans souci       sans           souci
5  aucun souci      aucun          souci
6  mal fait         mal            fait

J'aimerais retirer de la première liste les mots qui font doublon avec la seconde (dans la colonne 'first' ou 'second'), mais en prenant en compte le nombre d'occurrences qui fait doublon.
C'est à dire que j'aimerais retirer de la première liste 2 occurrences du mot "bien" puisque qu'on en retrouve 2 dans les colonnes 'first' et 'second' du deuxième set, mais pas la troisième occurence.
J'ai trouvé des explications pour retirer tous les doublons mais ce n'est pas ce dont j'ai besoin ici.

J'espère que je suis claire. N'hésitez pas à me questionner si je me suis mal exprimée.
Merci beaucoup !

Eric Casellas
Messages : 767
Enregistré le : 06 Jan 2009, 14:59

Re: Supprimer un certain nombre de doublons

Messagepar Eric Casellas » 19 Mai 2021, 12:52

Bonjour,

Un exemple de code (probablement non optimal) avec une boucle séquentielle dans laquelle est géré un vecteur temporaire des éléments restant à comparer :

Code : Tout sélectionner

X1 <- data.frame(word=c("avance", "bien", "bien", "bien", "bon", "mal"), stringsAsFactors = FALSE);

X2 <- data.frame(first=c("arrive", "pas", "bien", "sans", "aucun", "mal"),
                 second=c("pas", "bien", "sur", "soucis", "soucis", "fait"), stringsAsFactors = FALSE);

filter_duplicate <- function (dataset1, dataset2) {
  tmp_match <- c(dataset2$first, dataset2$second); # vecteur temporaire des valeurs restant a comparer
  for (i in length(dataset1$word):1) { # cette boucle étant sur les indices (lignes) d'un objet dont on supprime des elements, on commence par la fin pour ne pas etre impacté par les itérations précédentes
    if (dataset1$word[i]%in%tmp_match) {
      tmp_match <- tmp_match[-which(tmp_match==dataset1$word[i])[1]]; # on supprime ici la 1ere occurrence du mot trouvé
      dataset1 <- data.frame(word=dataset1[-i, ], stringsAsFactors = FALSE); # ici hypothèse que word est la seule colonne du 1er dataset
    }
  }
  return(dataset1);
}

filter_duplicate(X1, X2) # ne modifie pas l'objet X1


Eric
Eric

Pierre-Yves Berrard
Messages : 1029
Enregistré le : 12 Jan 2016, 23:30

Re: Supprimer un certain nombre de doublons

Messagepar Pierre-Yves Berrard » 19 Mai 2021, 13:23

Une autre idée en faisant un comptage des occurrences dans chaque data.frame :

Code : Tout sélectionner

compte1 <- table(X1$word)
compte2 <- table(unlist(X2[c("first", "second")]))

compar_comptes <-
  merge(
    as.data.frame(compte1),
    as.data.frame(compte2),
    by = "Var1",
    all.= TRUE
  
)

res <- data.frame(
  word = with(
    compar_comptes,
    rep(Var1, times = pmin(Freq.x, Freq.y, na.rm = TRUE))
  )

Code : Tout sélectionner

res
#>     word
#> 1 avance
#> 2   bien
#> 3   bien
#> 4    bon
#> 5    mal
 
PY

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

Re: Supprimer un certain nombre de doublons

Messagepar Logez Maxime » 19 Mai 2021, 13:24

Bonjour,

Une autre possibilité :

Code : Tout sélectionner

tab1 <- structure(list(word = c("avance", "bien", "bien", "bien", "bon",
"mal")), class = "data.frame", row.names = c("1", "2", "3", "4",
"5", "6"))

tab2 <- structure(list(`   word    ` = c("arrive pas", "pas bien", "bien sûr",
"sans souci", "aucun souci", "mal fait"), `first ` = c("arrive",
"pas", "bien", "sans", "aucun", "mal"), second = c("pas", "bien",
"sûr", "souci", "souci", "fait")), row.names = 2:7, class = "data.frame")

library(dplyr)
auxi <-as.data.frame(table(unlist(tab2[-1])))
colnames(auxi)[1] <- colnames(tab1)[1]

tab1 %>% left_join(auxi) %>% group_by(word) %>%
  mutate(N = pmax(n()-Freq, 1), N = ifelse(is.na(N), 1, N)) %>%
  filter(row_number() <= N) %>% select(-(Freq:N)) %>%
  ungroup()

[edit]
Si tu veux éliminer les n premières lignes correspondant au nombre de doublons

Code : Tout sélectionner

tab1 %>% left_join(auxi) %>% group_by(word) %>%
  mutate(N = pmin(n(), Freq+1), N = ifelse(is.na(N), 1, N)) %>%
  filter(row_number() >= N) %>% select(-(Freq:N)) %>%
  ungroup()

[/edit]
Cordialement,
Maxime

Pierre-Yves Berrard
Messages : 1029
Enregistré le : 12 Jan 2016, 23:30

Re: Supprimer un certain nombre de doublons

Messagepar Pierre-Yves Berrard » 19 Mai 2021, 13:30

C'est à dire que j'aimerais retirer de la première liste 2 occurrences du mot "bien" puisque qu'on en retrouve 2 dans les colonnes 'first' et 'second' du deuxième set, mais pas la troisième occurence.

En regardant les autres solutions, je ne suis plus sûr d'avoir bien compris. Il faut aussi retirer 1 "mal" du premier jeu de données puisque qu'on en retrouve 1 dans les colonnes 'first' et 'second' du deuxième set ?
PY

Leslie Jannin
Messages : 3
Enregistré le : 18 Mai 2021, 14:43

Re: Supprimer un certain nombre de doublons

Messagepar Leslie Jannin » 20 Mai 2021, 12:39

Pierre-Yves Berrard a écrit :En regardant les autres solutions, je ne suis plus sûr d'avoir bien compris. Il faut aussi retirer 1 "mal" du premier jeu de données puisque qu'on en retrouve 1 dans les colonnes 'first' et 'second' du deuxième set ?


Oui, c'est bien ça, "mal" qui apparait dans la colonne "first" est également concerné.
Je souhaite retirer les mots en doublons, mais en tenant compte du nombre de fois où ils apparaissent.

Merci pour vos idées, je vais regarder ça :)

Pierre-Yves Berrard
Messages : 1029
Enregistré le : 12 Jan 2016, 23:30

Re: Supprimer un certain nombre de doublons

Messagepar Pierre-Yves Berrard » 20 Mai 2021, 12:54

Ok ! Une petite modification de mon message précédent, alors :

Code : Tout sélectionner

compte1 <- table(X1$word)
compte2 <- table(unlist(X2[c("first""second")]))

compar_comptes <-
  
merge(
    as.
data.frame(compte1),
    as.
data.frame(compte2),
    
by "Var1",
    
all.TRUE
  
)
compar_comptes$Freq.<- ifelse(is.na(compar_comptes$Freq.y), 0compar_comptes$Freq.y)

res <- data.frame(
  
word with(
    
compar_comptes,
    
rep(Var1times Freq.Freq.y)
  )

Code : Tout sélectionner

res
#>     word
#> 1 avance
#> 2   bien
#> 3    bon
PY

Leslie Jannin
Messages : 3
Enregistré le : 18 Mai 2021, 14:43

Re: Supprimer un certain nombre de doublons

Messagepar Leslie Jannin » 21 Mai 2021, 08:39

Ça fonctionne ! Merci beaucoup !
J'ai testé ces solutions sur des données plus complètes et je suis partie sur la solution de Pierre-Yves, que je trouve plus simple à comprendre pour moi.

Merci à tous !


Retourner vers « Questions en cours »

Qui est en ligne

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