156 votes

Recherche de TOUTES LES lignes en double, y compris les "éléments avec des indices plus petits"

R' s duplicated renvoie un vecteur indiquant si chaque élément d'un vecteur ou d'une trame de données est un duplicata d'un élément avec un indice plus petit. Donc, si les lignes 3, 4 et 5 d'une trame de données à 5 lignes sont les mêmes, duplicated me donnera le vecteur

FALSE, FALSE, FALSE, TRUE, TRUE

Mais dans ce cas, je veux vraiment obtenir

FALSE, FALSE, TRUE, TRUE, TRUE

c'est-à-dire, je veux savoir si une ligne est dupliquée par une ligne avec un indice plus grand aussi.

42voto

BondedDust Points 105234

Vous devez assembler l'ensemble de valeurs duplicated, appliquer unique, puis tester avec %in%. Comme toujours, un problème d'échantillon donnera vie à ce processus.

> vec <- c("a", "b", "c","c","c")
> vec[ duplicated(vec)]
[1] "c" "c"
> unique(vec[ duplicated(vec)])
[1] "c"
>  vec %in% unique(vec[ duplicated(vec)]) 
[1] FALSE FALSE  TRUE  TRUE  TRUE

22voto

Holger Brandl Points 124

Les lignes dupliquées dans une trame de données peuvent être obtenues avec dplyr en faisant

library(tidyverse)
df = bind_rows(iris, head(iris, 20)) # build some test data
df %>% group_by_all() %>% filter(n()>1) %>% ungroup()

Exclure certaines colonnes group_by_at(vars(-var1, -var2)) pourrait être utilisé à la place pour regrouper les données.

Si les index de ligne et pas seulement les données sont réellement nécessaires, vous pouvez les ajouter en premier comme dans :

df %>% add_rownames %>% group_by_at(vars(-rowname)) %>% filter(n()>1) %>% pull(rowname)

4voto

canderson156 Points 23

Voici la solution de @Joshua Ulrich en tant que fonction. Ce format vous permet d'utiliser ce code de la même manière que vous utiliseriez duplicated() :

allDuplicated <- function(vec){
  front <- duplicated(vec)
  back <- duplicated(vec, fromLast = TRUE)
  all_dup <- front + back > 0
  return(all_dup)
}

En utilisant le même exemple :

vec <- c("a", "b", "c","c","c") 
allDuplicated(vec) 
[1] FALSE FALSE  TRUE  TRUE  TRUE

3voto

François M. Points 1298

J'ai eu la même question, et si je ne me trompe pas, c'est aussi une réponse.

vec[col %in% vec[duplicated(vec$col),]$col]

Je ne sais pas lequel est le plus rapide, cependant, l'ensemble de données que j'utilise actuellement n'est pas assez grand pour faire des tests qui produisent des intervalles de temps importants.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X