我有一个数据集,其行是对年份和阶段的单独观察,并且在给定年份中可以对给定阶段进行零到多个观察:
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年)。我已经通过dplyr
和tidyr
找出了以下方法:
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
的情况下对这些年进行子集化?
答案 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)