web-dev-qa-db-fra.com

Différence entre Distinct et Unique

Quelles sont les différences entre distinct et unique dans R en utilisant dplyr en prenant en compte:

  • La vitesse
  • Capacités (entrées valides, paramètres, etc.) et utilisations
  • Sortie

Par exemple:

library(dplyr)
data(iris)

# creating data with duplicates
iris_dup <- bind_rows(iris, iris)

d <- distinct(iris_dup)
u <- unique(iris_dup)

all(d==u) # returns True

Dans cet exemple, distinct et unique remplissent la même fonction. Y a-t-il des exemples de fois où vous devriez utiliser l'un mais pas l'autre? Existe-t-il des astuces ou des utilisations courantes? 

7
Anna

Ces fonctions peuvent être utilisées de manière interchangeable, car il existe des commandes équivalentes dans les deux fonctions. La principale différence réside dans la vitesse et le format de sortie. 

distinct() est une fonction du paquet dplyr et peut être personnalisée. Par exemple, l'extrait de code suivant ne renvoie que les éléments distincts d'un ensemble de colonnes spécifié dans le cadre de données.

distinct(iris_dup, Petal.Width, Species)

unique() renvoie strictement les lignes uniques dans un cadre de données. Tous les éléments de chaque ligne doivent correspondre pour être qualifiés de doublons.

Edit: Comme le souligne Imo, unique() a une fonctionnalité similaire. Nous obtenons un cadre de données temporaire et en trouvons les lignes uniques. Ce processus peut être plus lent pour les grandes trames de données.

unique(iris_dup[c("Petal.Width", "Species")])

Les deux renvoient le même résultat (avec une légère différence - ils indiquentdifférentsnuméros de rangées). distinct renvoie une liste ordonnée, alors que unique renvoie le numéro de ligne de la première occurrence de chaque élément unique.

     Petal.Width    Species
1          0.2     setosa
2          0.4     setosa
3          0.3     setosa
4          0.1     setosa
5          0.5     setosa
6          0.6     setosa
7          1.4 versicolor
8          1.5 versicolor
9          1.3 versicolor
10         1.6 versicolor
11         1.0 versicolor
12         1.1 versicolor
13         1.8 versicolor
14         1.2 versicolor
15         1.7 versicolor
16         2.5  virginica
17         1.9  virginica
18         2.1  virginica
19         1.8  virginica
20         2.2  virginica
21         1.7  virginica
22         2.0  virginica
23         2.4  virginica
24         2.3  virginica
25         1.5  virginica
26         1.6  virginica
27         1.4  virginica

Globalement, les deux fonctions renvoient les éléments de ligne uniques en fonction de l'ensemble combiné de colonnes choisi. Cependant, je suis enclin à citer la bibliothèque dplyr et à déclarer que distinct est plus rapide.

7
Raj Padmanabhan

En ce qui concerne deux de vos critères, la vitesse et la saisie, voici une petite fonction utilisant la bibliothèque tictoc. Cela montre que distinct() est nettement plus rapide (l’entrée contient des colonnes numériques et caractères):

library(dplyr)
library(tictoc)
library(glue)

make_a_df <- function(nrows = NULL){
  tic()
  df <- tibble(
    alpha = sample(letters, nrows, replace = TRUE),
    numeric = rnorm(mean = 0, sd = 1, n = nrows)
  )
  unique(df)
  print(glue('Unique with {nrows}: '))
  toc()

  tic()
  df <- tibble(
    alpha = sample(letters, nrows, replace = TRUE),
    numeric = rnorm(mean = 0, sd = 1, n = nrows)
  )
  distinct(df)
  print(glue('Distinct with {nrows}: '))
  toc()
}

Résultat: 

> make_a_df(50); make_a_df(500); make_a_df(5000); make_a_df(50000); make_a_df(500000)
Unique with 50: 
0.02 sec elapsed
Distinct with 50: 
0 sec elapsed
Unique with 500: 
0 sec elapsed
Distinct with 500: 
0 sec elapsed
Unique with 5000: 
0.02 sec elapsed
Distinct with 5000: 
0 sec elapsed
Unique with 50000: 
0.09 sec elapsed
Distinct with 50000: 
0.01 sec elapsed
Unique with 5e+05: 
1.77 sec elapsed
Distinct with 5e+05: 
0.34 sec elapsed
1
RobertMyles