wake-up-neo.net

Unterschied zwischen Distinct und Unique

Was sind die Unterschiede zwischen distinct und unique in R unter Verwendung von dplyr unter Berücksichtigung von:

  • Geschwindigkeit
  • Funktionen (gültige Eingaben, Parameter usw.) und Verwendung
  • Ausgabe

Zum Beispiel:

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

In diesem Beispiel führen distinct und unique dieselbe Funktion aus. Gibt es Beispiele für Zeiten, in denen Sie die eine verwenden sollten, die andere jedoch nicht? Gibt es Tricks oder übliche Verwendungsmöglichkeiten? 

7
Anna

Diese Funktionen können austauschbar verwendet werden, da in beiden Funktionen äquivalente Befehle vorhanden sind. Der Hauptunterschied liegt in der Geschwindigkeit und im Ausgabeformat. 

distinct() ist eine Funktion unter dem Paket dplyr und kann angepasst werden. Das folgende Snippet gibt beispielsweise nur die verschiedenen Elemente einer angegebenen Menge von Spalten im Datenrahmen zurück

distinct(iris_dup, Petal.Width, Species)

unique() gibt die eindeutigen Zeilen in einem Datenrahmen strikt zurück. Alle Elemente in jeder Zeile müssen übereinstimmen, um als Duplikate bezeichnet zu werden.

Edit: Wie Imo hervorhebt, hat unique() eine ähnliche Funktionalität. Wir erhalten ein temporäres Datenframe und finden die eindeutigen Zeilen daraus. Dieser Vorgang kann für große Datenframes langsamer sein.

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

Beide geben dieselbe Ausgabe zurück (allerdings mit einem kleinen Unterschied - sie zeigenverschiedeneZeilennummern an). distinct gibt eine geordnete Liste zurück, wohingegen unique die Zeilennummer des ersten Vorkommens jedes einzelnen Elements zurückgibt.

     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

Insgesamt liefern beide Funktionen die eindeutigen Zeilenelemente basierend auf dem ausgewählten Spaltensatz. Ich neige jedoch dazu, die dplyr-Bibliothek zu zitieren und zu sagen, dass distinct schneller ist.

7
Raj Padmanabhan

In Bezug auf zwei Ihrer Kriterien, Geschwindigkeit und Eingabe, finden Sie hier eine kleine Funktion der tictoc-Bibliothek. Es zeigt, dass distinct() deutlich schneller ist (die Eingabe hat numerische und Zeichenspalten):

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()
}

Ergebnis: 

> 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