使用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

   x y  z

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]),]

  x y z

1 0 1 1

2 1 0 2

4 1 1 4

我正在寻找使用dplyr包的解决方案。


SMILET
浏览 1727回答 3
3回答

幕布斯7119047

注意:dplyr现在包含distinct用于此目的的功能。原始答案如下:library(dplyr)set.seed(123)df <- data.frame(&nbsp; x = sample(0:1, 10, replace = T),&nbsp; y = sample(0:1, 10, replace = T),&nbsp; z = 1:10)一种方法是分组,然后仅保留第一行:df %>% group_by(x, y) %>% filter(row_number(z) == 1)## Source: local data frame [3 x 3]## Groups: x, y##&nbsp;##&nbsp; &nbsp;x y z## 1 0 1 1## 2 1 0 2## 3 1 1 4(在dplyr 0.2中,您将不需要哑z变量,并且只需要编写即可row_number() == 1)我也一直在考虑添加一个slice()功能,如:df %>% group_by(x, y) %>% slice(from = 1, to = 1)或者,也许可以通过变种来unique()选择要使用的变量:df %>% unique(x, y)

拉丁的传说

这是使用的解决方案dplyr 0.3。library(dplyr)set.seed(123)df <- data.frame(&nbsp; x = sample(0:1, 10, replace = T),&nbsp; y = sample(0:1, 10, replace = T),&nbsp; z = 1:10)> df %>% distinct(x, y)&nbsp; &nbsp; x y z&nbsp; 1 0 1 1&nbsp; 2 1 0 2&nbsp; 3 1 1 4更新为dplyr 0.5dplyr版本0.5的默认行为是distinct()仅返回...参数中指定的列。为了获得原始结果,您现在必须使用:df %>% distinct(x, y, .keep_all = TRUE)

月关宝盒

大多数时候,最好的解决方案是使用distinct()dplyr,正如已经建议的那样。但是,这是另一种使用slice()dplyr函数的方法。# Generate fake data for the example&nbsp; library(dplyr)&nbsp; set.seed(123)&nbsp; df <- data.frame(&nbsp; &nbsp; x = sample(0:1, 10, replace = T),&nbsp; &nbsp; y = sample(0:1, 10, replace = T),&nbsp; &nbsp; z = 1:10&nbsp; )# In each group of rows formed by combinations of x and y# retain only the first row&nbsp; &nbsp; df %>%&nbsp; &nbsp; &nbsp; group_by(x, y) %>%&nbsp; &nbsp; &nbsp; slice(1)与使用distinct()功能的区别此解决方案的优点是,它可以使从原始数据帧中保留哪些行变得明确,并且可以与该arrange()函数很好地配对。假设您有客户销售数据,并且希望为每个客户保留一条记录,并且希望该记录成为他们最近一次购买的记录。然后,您可以编写:customer_purchase_data %>%&nbsp; &nbsp;arrange(desc(Purchase_Date)) %>%&nbsp; &nbsp;group_by(Customer_ID) %>%&nbsp; &nbsp;slice(1)
打开App,查看更多内容
随时随地看视频慕课网APP