Использование дублированного фильтра с dplyr по количеству входов - PullRequest
0 голосов
/ 16 ноября 2018

В настоящее время я использую следующую строку кода для фильтрации кадра данных на основе двух переменных и двух условий.

df %>% filter(v1 %in% c('value1', 'value2')) %>% 
        filter(v2 %in% v2[duplicated(v2)])

В моем наборе данных v1 состоит из нескольких тегов, а v2 состоит из user_ids. Один user_id в v2 может иметь несколько тегов (в v1), выглядящих следующим образом:

v1      v2 
html    piet
c#      piet 
c#      klaas
html    klaas
python  klaas

когда я использую строку кода, с которой я сейчас работаю, она прекрасно справится с работой, когда я использую только два значения, например df %>% filter(v1 %in% c('c#', 'html')) %>% filter(v2 %in% v2[duplicated(v2)]) приятно вернется:

v1      v2 
html    piet
c#      piet 
c#      klaas
html    klaas

Но при использовании трех значений в первом фильтре, например, df %>% filter(v1 %in% c('c#', 'html', 'python')) %>% filter(v2 %in% v2[duplicated(v2)]) он также возвращает значения piet, тогда как на самом деле я хочу, чтобы он возвращал только значения klaas следующим образом:

v1      v2 
c#      klaas
html    klaas
python  klaas

Как мне это сделать?

1 Ответ

0 голосов
/ 16 ноября 2018

Вы отфильтровываете случаи, когда v1 для любой конкретной строки не равно ни одной из трех строк. Это не то, чего вы пытаетесь достичь - вы хотите сохранить только v2 группы, в которых все три строки представлены в v1. Способ достижения этого:

df %>% group_by(v2) %>% 
  filter(all(c('c#', 'html', 'python') %in% v1))

Сначала мы группируем по v2, затем фильтруем эти группы так, чтобы в них входили только те, в которых all три строки %in% вектор v1 s этой группы.

Обратите внимание, что порядок для команды %in% обратный по сравнению с вашим кодом, потому что нам все равно, есть ли в v1 другие случаи, нам важно, чтобы все три случая были представлены в v1 - если мы также хотите исключить все случаи, когда v1 не входит в эти три, у вас должны быть оба направления, как в следующем примере:

df<-rbind(df,data.frame(v1="moose",v2="klaas"))
df %>% group_by(v2) %>% 
  filter(all(c('c#', 'html', 'python') %in% v1), v1 %in% c('c#', 'html', 'python'))
# A tibble: 3 x 2
# Groups:   v2 [1]
  v1     v2   
  <fct>  <fct>
1 c#     klaas
2 html   klaas
3 python klaas
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...