2017-10-26 4 views
1

私は、年と舞台を個別に観測し、与えられた年の所与のステージの観測数を0から複数にすることができるデータセットを持っています: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 

これは少し不格好ようで、非常に大規模なデータセットのためにうまくスケールアップしない場合があります。 tidyr::spreadを使わずにdplyrを使用してこれらの年のサブセットを作成する簡単で簡単な方法はありますか?

答えて

2

多分これはあなたのために動作します:

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

group_by %>% filterを使用できます。各グループについて、ab両方が段階列あるかどうかを確認し、それに基づいてグループをフィルタリングするall(c('a', 'b') %in% 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 
関連する問題