Фильтрация по результатам группировки - PullRequest
0 голосов
/ 29 июня 2018

В моем полном наборе данных есть повторные опросы в тех же областях. Моя проблема в том, что я пытаюсь выбрать те, по которым они были опрошены каждый год, когда проводились опросы. Еще одна ситуация касается тех, которые были опрошены как минимум 3 из 4 раз.

Я создал следующий пример данных, чтобы подчеркнуть, что я пытаюсь сделать:

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) %>% ???

пока что, но ??? представляет, где я потерял, как отфильтровать это, чтобы вернуть вектор идентификаторов, относящихся к моим требованиям.

Для первой проблемы я бы хотел отфильтровать, чтобы получить вектор (1, 2, 3, 4), поскольку area_id 1 был единственным, обследованным за все 4 года.

Для второй проблемы я бы хотел, чтобы вектор был (1, 2, 3, 4, 5, 6, 7).

Каков был бы подходящий способ справиться с этим?

Ответы [ 2 ]

0 голосов
/ 29 июня 2018

Как насчет этого?

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
0 голосов
/ 29 июня 2018

Для случая 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...