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

使用dplyr过滤变量中所有类别观测值的年份,r,dplyr,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",

我有一个数据集,其中的行是一年和一个阶段的单个观测值,在给定的一年中,可以有零到多个给定阶段的观测值:

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

这似乎有点笨重,对于非常大的数据集可能无法很好地扩展。有没有更简单、更直接的方法可以使用
dplyr
对这些年份进行子集划分,而无需调用
tidyr::spread

您可以使用
分组依据%>%filter
;对于每个组,使用
all(c('a','b')%在%stage)
检查
a
b
是否都在stage列中,并根据它筛选组:

df %>% group_by(year) %>% filter(all(c('a', 'b') %in% stage))

# A tibble: 6 x 2
# Groups:   year [2]
#   year  stage
#  <dbl> <fctr>
#1  2000      a
#2  2000      a
#3  2000      a
#4  2000      b
#5  2002      a
#6  2002      b
df%>%group_by(year)%>%filter(所有(c('a','b')%在%stage中))
#一个tibble:6x2
#组别:年份[2]
#年期
#   
#1 2000年a
#2000年1月2日
#3 2000年a
#2000年b月4日
#5 2002年a
#6 2002年b

您可以使用
分组依据%>%filter
;对于每个组,使用
all(c('a','b')%在%stage)
检查
a
b
是否都在stage列中,并根据它筛选组:

df %>% group_by(year) %>% filter(all(c('a', 'b') %in% stage))

# A tibble: 6 x 2
# Groups:   year [2]
#   year  stage
#  <dbl> <fctr>
#1  2000      a
#2  2000      a
#3  2000      a
#4  2000      b
#5  2002      a
#6  2002      b
df%>%group_by(year)%>%filter(所有(c('a','b')%在%stage中))
#一个tibble:6x2
#组别:年份[2]
#年期
#   
#1 2000年a
#2000年1月2日
#3 2000年a
#2000年b月4日
#5 2002年a
#6 2002年b

也许这对你有用:

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

也许这对你有用:

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