簡體   English   中英

使用dplyr使用變量中所有類別的觀察值過濾年份

[英]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)。 我想出了用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進行子集化?

您可以使用group_by %>% filter ; 對於每個組,使用all(c('a', 'b') %in% stage)檢查ab是否都 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM