区别与独特之间的区别

时间:2017-07-19 18:47:45

标签: r dplyr

考虑到使用dplyr,R中distinctunique之间有什么区别:

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

例如:

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

在此示例中,distinctunique执行相同的功能。有没有时间你应该使用一个而不是另一个?是否有任何技巧或常用?

2 个答案:

答案 0 :(得分:8)

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

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

答案 1 :(得分:1)

关于您的两个条件,速度和输入,这是使用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