2016-11-04 71 views
1

我有一个数据帧,每行有一个观察值,每个主题有两个观察值。我想过滤出只有重复的'天'数字的行。从r中的数据帧过滤重复数据

ex <- data.frame('id'= rep(1:5,2), 'day'= c(1:5, 1:3,5:6))  

以下代码会过滤掉第二个重复的行,但不是第一个。再次,我想过滤掉两个重复的行。

ex %>% 
    group_by(id) %>% 
    filter(duplicated(day)) 

以下代码有效,但看起来很笨重。有没有人有更有效的解决方案?

ex %>% 
    group_by(id) %>% 
    filter(duplicated(day, fromLast = TRUE) | duplicated(day, fromLast = FALSE)) 

回答

2

duplicated可以对整个数据集被应用,这可以用base R方法来完成。

ex[duplicated(ex)|duplicated(ex, fromLast = TRUE),] 

使用dplyr,我们只能当行(n())的数量为group_by都列和filter大于1

ex %>% 
    group_by(id, day) %>% 
    filter(n()>1) 
1

单tidyverse管:

exSinglesOnly <- 
    ex %>% 
    group_by(id,day) %>% # the complete group of interest 
    mutate(duplicate = n()) %>% # count number in each group 
    filter(duplicate == 1) %>% # select only unique records 
    select(-duplicate) # remove group count column 
> exSinglesOnly 
Source: local data frame [4 x 2] 
Groups: id, day [4] 

    id day 
    <int> <int> 
1  4  4 
2  5  5 
3  4  5 
4  5  6 
+0

哦,我没有见过@ Akrun的第二个答案。这与之相似,但我会留下来帮助解释与完整分组和后续过滤有关的逻辑。 –