Фильтрация по набору значений в r (dplyr) - PullRequest
1 голос
/ 07 марта 2019

У меня есть вопрос относительно фильтрации с использованием пакета dplyr в R.

У меня есть текущий фрейм данных следующим образом:

  url                       season    salary
   <fct>                     <fct>      <dbl>
 1 /players/a/abrinal01.html 2016-17  5725000
 2 /players/a/ackeral01.html 2008-09   711517
 3 /players/a/acyqu01.html   2012-13   788872
 4 /players/a/acyqu01.html   2013-14   915243
 5 /players/a/acyqu01.html   2014-15   981348
 6 /players/a/acyqu01.html   2015-16  1914544
 7 /players/a/acyqu01.html   2016-17  1709538
 8 /players/a/adamsjo01.html 2014-15  1404600
 9 /players/a/adamsst01.html 2014-15  3140517
10 /players/a/adamsst01.html 2016-17 22471910
11 /players/a/adamsst01.html 2017-18 2571910

Я хочу сгруппировать по URLи сохраняйте только те строки, которые содержат URL-адреса, которые воспроизводились только в сезонах 2012–2013, 2013–2014 и 2014–2015 годах.

Я пробовал это, но выдает ошибку:

Ошибка в filter_impl (.data, quo): результат должен иметь длину 1, а не 3

p_filter <- p_g_stagger %>% 
  dplyr :: group_by(url) %>%
  dplyr :: filter(season == c('2012-13', '2013-14', '2014-15'))

Мой желаемый вывод такой:

       url                       season    salary
       <fct>                     <fct>      <dbl>
     1 /players/a/acyqu01.html   2012-13   788872
     2 /players/a/acyqu01.html   2013-14   915243
     3 /players/a/acyqu01.html   2014-15   981348

Ответы [ 2 ]

4 голосов
/ 07 марта 2019

Нам нужны два условия в filter

1) Фильтрует только те группы (url), которые имеют all season_needed

2) Фильтрует только season_needed из выбранных групп в условии 1.

season_needed <- c('2012-13', '2013-14', '2014-15')
library(dplyr)

df %>%
  group_by(url) %>%
  filter(all(season_needed %in% season) & season %in% season_needed)

#  url                     season  salary
#  <fct>                   <fct>    <int>
#1 /players/a/acyqu01.html 2012-13 788872
#2 /players/a/acyqu01.html 2013-14 915243
#3 /players/a/acyqu01.html 2014-15 981348
0 голосов
/ 08 марта 2019

другой подход, использующий add_count.

seasons_in <- c('2012-13', '2013-14', '2014-15')

p_g_stagger %>% 
  filter(season %in% seasons_in) %>% 
  add_count(url, name = "nb_seasons") %>% 
  filter(nb_seasons == length(seasons_in)) %>% 
  select(-nb_seasons)
...