使用dplyr删除重复的行

我有这样的data.frame –

set.seed(123) df = data.frame(x=sample(0:1,10,replace=T),y=sample(0:1,10,replace=T),z=1:10) > df xyz 1 0 1 1 2 1 0 2 3 0 1 3 4 1 1 4 5 1 0 5 6 0 1 6 7 1 0 7 8 1 0 8 9 1 0 9 10 0 1 10 

我想根据前两列删除重复的行。 预期产出 –

 df[!duplicated(df[,1:2]),] xyz 1 0 1 1 2 1 0 2 4 1 1 4 

我正在寻找使用dplyr软件包的解决scheme。

 library(dplyr) set.seed(123) df <- data.frame( x = sample(0:1, 10, replace = T), y = sample(0:1, 10, replace = T), z = 1:10 ) 

一种方法是分组,然后只保留单个行:

 df %>% group_by(x, y) %>% filter(row_number(z) == 1) ## Source: local data frame [3 x 3] ## Groups: x, y ## ## xyz ## 1 0 1 1 ## 2 1 0 2 ## 3 1 1 4 

(在dplyr 0.2中,你不需要dummy zvariables,只需要写row_number() == 1

我也一直在考虑添加一个slice()函数,它的工作原理是:

 df %>% group_by(x, y) %>% slice(from = 1, to = 1) 

或者可能是unique()一个变体,它可以让你select使用哪些variables:

 df %>% unique(x, y) 

这是一个使用dplyr 0.3的解决scheme。

 library(dplyr) set.seed(123) df <- data.frame( x = sample(0:1, 10, replace = T), y = sample(0:1, 10, replace = T), z = 1:10 ) > df %>% distinct(x, y) xyz 1 0 1 1 2 1 0 2 3 1 1 4 

更新为dplyr 0.5

distinct() dplyr版本0.5默认行为仅返回...参数中指定的列。

要达到原始结果,您现在必须使用:

 df %>% distinct(x, y, .keep_all = TRUE) 

为了完整起见,以下内容也适用:

 df %>% group_by(x) %>% filter (! duplicated(y)) 

不过,我更喜欢使用distinct的解决scheme,我怀疑它也更快。

当在R中select列来减less数据集时,通常可能会出现重复数据。

这两行给出了相同的结果。 每个输出一个唯一的数据集只有两个选定的列:

 distinct(mtcars, cyl, hp); summarise(group_by(mtcars, cyl, hp));