使用dplyr考虑到R distinct和uniqueR 之间有什么区别:
例如:
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
Run Code Online (Sandbox Code Playgroud)
在该示例中distinct并且unique执行相同的功能.有没有时间你应该使用一个而不是另一个?是否有任何技巧或常用?
这些功能可以互换使用,因为在两个功能中都存在等效命令.主要区别在于速度和输出格式.
distinct()是包dplyr下的一个函数,可以自定义.例如,以下代码段仅返回数据框中指定列集的不同元素
distinct(iris_dup, Petal.Width, Species)
Run Code Online (Sandbox Code Playgroud)
unique()严格返回数据框中的唯一行.每行中的所有元素必须匹配才能称为重复.
编辑:正如Imo所指出的,unique()具有类似的功能.我们获取一个临时数据帧并从中找到唯一的行.对于大型数据帧,此过程可能较慢.
unique(iris_dup[c("Petal.Width", "Species")])
Run Code Online (Sandbox Code Playgroud)
两者都返回相同的输出(尽管差异很小 - 它们表示不同的行号).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
Run Code Online (Sandbox Code Playgroud)
总的来说,两个函数都根据所选的组合列返回唯一的行元素.但是,我倾向于引用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()
}
Run Code Online (Sandbox Code Playgroud)
结果:
> 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
Run Code Online (Sandbox Code Playgroud)