我有一个这样的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包的解决方案。
dplyr
注意 :dplyr现在包含distinct用于此目的的功能。
distinct
原答案如下:
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 ## ## x y z ## 1 0 1 1 ## 2 1 0 2 ## 3 1 1 4
(在 dplyr 0.2 中,您不需要虚拟z变量,只需编写即可row_number() == 1)
z
row_number() == 1
我也一直在考虑添加一个slice()类似的功能:
slice()
df %>% group_by(x, y) %>% slice(from = 1, to = 1)
或者,也许它的变体unique()可以让您选择要使用的变量:
unique()
df %>% unique(x, y)