独特与独特之间的区别

问题描述 投票:0回答:3

R 中使用 dplyr 的

distinct
unique
之间有什么区别,考虑到:

  • 速度
  • 功能(有效输入、参数等)和用途
  • 输出

例如:

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
执行相同的功能。有没有什么时候应该使用其中一种而不是另一种的例子?有什么技巧或常见用途吗?

r dplyr
3个回答
17
投票

这些函数可以互换使用,因为这两个函数中存在等效的命令。主要区别在于速度和输出格式。

distinct()
是dplyr包下的一个函数,可以自定义。例如,以下代码片段仅返回数据框中指定列集的不同元素

distinct(iris_dup, Petal.Width, Species)

unique()
严格返回数据框中的唯一行。每行中的所有元素必须匹配才能被称为重复项。

编辑:正如 Imo 指出的,

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
更快。


5
投票

关于您的两个标准,速度和输入,这里有一个使用 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

0
投票

如果您使用

data.table
,则有理由怀疑在
unique()
对象上操作时
distinct()
dt
更快。这里我发现当n
=1e+07时
unique()<= 1e+06 and manifests when n>的速度优势并不体现出来,遵循@RobertMyles的做法:

library(dplyr)
library(tictoc)
library(glue)
library(data.table)

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

make_a_df(10000000); make_a_df(1000000)
Unique with 1e+06: 
0 sec elapsed
Distinct with 1e+06: 
0.02 sec elapsed
Unique with 1e+07: 
0.06 sec elapsed
Distinct with 1e+07: 
0.62 sec elapsed
© www.soinside.com 2019 - 2024. All rights reserved.