使用分组结果过滤

时间:2018-06-29 03:57:02

标签: r dplyr

在我的完整数据集中,有相同领域的重复调查。我的问题是,我试图选择在进行调查的每一年中接受过调查的对象。另一种情况是,四次中至少有三次被调查过。

我制作了以下示例数据集以突出显示我正在尝试做的事情:

id   area_id   year
 1         1   2010
 2         1   2011
 3         1   2012
 4         1   2013
 5         2   2010
 6         2   2011
 7         2   2013
 8         3   2010
 9         3   2012
10         4   2012

使用以下代码轻松创建它:

ex_df <- data.frame(id = 1:10,
                    area_id = c(rep(1, 4), rep(2, 3), rep(3, 2), 4),
                    year = c(2010:2013, 2010, 2011, 2013, 2010, 2012, 2012))

我对dplyr的简单理解让我在做

ex_df %>% group_by(area_id, year) %>% ???

到目前为止,但是???表示我迷失了如何过滤它以返回与我的需求有关的ID向量的地方。

对于第一个问题,我想过滤以将向量(1, 2, 3, 4)赋予area_id 1,因为这是过去四年中唯一被调查的向量。

对于第二个问题,我希望向量为(1, 2, 3, 4, 5, 6, 7)

什么是适当的管理方式?

2 个答案:

答案 0 :(得分:2)

对于情况1:

ex_df %>%
    group_by(area_id) %>%
    filter(n() == 4) %>%
    pull(id)
#[1] 1 2 3 4    

对于情况2:

ex_df %>%
    group_by(area_id) %>%
    filter(n() >= 3) %>%
    pull(id)
#[1] 1 2 3 4 5 6 7

答案 1 :(得分:1)

怎么样?

required_years <- 2010:2013

ex_df2 <- ex_df %>%
  group_by(area_id) %>%
  mutate(
    fouryears = all(required_years %in% year),
    threeyears = sum(required_years %in% year) >= 3
  )
ex_df2
# Source: local data frame [10 x 5]
# Groups: area_id [4]
#       id area_id  year fouryears threeyears
#    <int>   <dbl> <dbl>     <lgl>      <lgl>
# 1      1       1  2010      TRUE       TRUE
# 2      2       1  2011      TRUE       TRUE
# 3      3       1  2012      TRUE       TRUE
# 4      4       1  2013      TRUE       TRUE
# 5      5       2  2010     FALSE       TRUE
# 6      6       2  2011     FALSE       TRUE
# 7      7       2  2013     FALSE       TRUE
# 8      8       3  2010     FALSE      FALSE
# 9      9       3  2012     FALSE      FALSE
# 10    10       4  2012     FALSE      FALSE

(您可以pull领取所需的东西)

filter(ex_df2, fouryears) %>% pull(id)
# [1] 1 2 3 4
filter(ex_df2, threeyears) %>% pull(id)
# [1] 1 2 3 4 5 6 7