[英]Filter years with observations of all categories in a variable using 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)。 我想出了用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
這似乎有些笨拙,並且對於非常大的數據集可能無法很好地擴展。 有什么更簡單,更直接的方法可以在不調用tidyr::spread
情況下使用dplyr
進行子集化?
您可以使用group_by %>% filter
; 對於每個組,使用all(c('a', 'b') %in% 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(length(unique(stage)) == 2)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.