Разница между Distinct и Unique

каковы различия между distinct и unique в R с использованием dplyr с учетом:

  • скорость
  • возможности (действительные входные сигналы, параметры, etc) & пользы
  • выход

например:

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

в этом примере distinct и unique выполните ту же функцию. Есть ли примеры случаев, когда вы должны использовать один, но не другой? Есть ли какие-либо трюки или общее использование одного?

2 ответов


эти функции могут использоваться взаимозаменяемо, поскольку в обеих функциях существуют эквивалентные команды. Основное отличие заключается в скорости и формате вывода.

distinct() - это функция под dplyr пакет, и может быть подгоняно. Например, следующий фрагмент возвращает только отдельные элементы указанного набора столбцов в фрейме данных

distinct(iris_dup, Petal.Width, Species)

unique() строго возвращает уникальные строки в таблице данных. Все элементы в каждой строке должно совпадать, чтобы называться дубликатами.

Edit: как указывает Имо,unique() имеет аналогичную функциональность. Мы получаем временный фрейм данных и находим из него уникальные строки. Этот процесс может быть медленнее для больших фреймов данных.

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

оба возвращают один и тот же вывод (хотя и с небольшой разницей - они указывают разные номера строк). distinct возвращает упорядоченный список, тогда как 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

в целом, обе функции возвращают уникальные элементы строки на основе комбинированного набора выбранных столбцов. Однако я склонен процитировать dplyr библиотека и заявить, что distinct быстрее.


что касается двух ваших критериев, скорости и ввода, вот небольшая функция, использующая библиотеку tictoc. Это показывает, что distinct() заметно быстрее (вход имеет числовые и символьные столбцы):

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

результат:

> 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