使用dplyr过滤年份,观察变量中的所有类别

时间:2017-10-26 13:08:09

标签: r dplyr

我有一个数据集,其行是对年份和阶段的单独观察,并且在给定年份中可以对给定阶段进行零到多个观察:

df <- data.frame(year = c(2000, 2000, 2000, 2000, 2001, 2001, 
                          2001, 2002, 2002, 2003, 2003, 2003),
                 stage = c("a", "a", "a", "b", "b", "b",
                           "b", "a", "b", "a", "a", "a")) 
df
##    year stage
## 1  2000     a
## 2  2000     a
## 3  2000     a
## 4  2000     b
## 5  2001     b
## 6  2001     b
## 7  2001     b
## 8  2002     a
## 9  2002     b
## 10 2003     a
## 11 2003     a
## 12 2003     a

我希望过滤数据,只选择对a和b阶段进行观察的年份(在本例中为2000年和2002年)。我已经通过dplyrtidyr找出了以下方法:

library(dplyr) 
library(tidyr) 

yrs <- df %>% 
  group_by(year, stage) %>%
  summarise(n = n()) %>%
  spread(stage, -year) %>% 
  na.omit %>% 
  pull(year) 

yrs
## [1] 2000 2002

filter(df, year %in% yrs)
##   year stage
## 1 2000     a
## 2 2000     a
## 3 2000     a
## 4 2000     b
## 5 2002     a
## 6 2002     b

这看起来有点笨重,可能无法适用于非常大的数据集。是否有更简单,更直接的方法使用dplyr在不调用tidyr::spread的情况下对这些年进行子集化?

2 个答案:

答案 0 :(得分:2)

您可以使用group_by %>% filter;对于每个组,使用all(c('a', 'b') %in% stage)检查阶段列中<{1}}和a 在它上面:

b

答案 1 :(得分:2)

也许这对你有用:

df %>% group_by(year) %>% 
       filter(length(unique(stage)) == 2)