R: лучший способ фильтрации по группе и вектору значений? - PullRequest
2 голосов
/ 06 апреля 2020

У меня есть датафрейм, содержащий values и type. Я хочу отфильтровать df по:

  • , содержащему только types, который содержит все значения в векторе
  • , сохраняя только указанные значения c на type.

Я могу выполнить это sh в двухэтапной фильтрации, но, похоже, она подвержена ошибкам. Может быть, потому что порядок filter(keep.val %in% vals) и filter(vals %in% keep.val) только в обратном порядке, но создает другой вывод?

Вот мои фиктивные данные:

   keep.val = c(1,3)
   d <- data.frame(type = rep(c("a", "b", "d"), each = 4),
                vals = as.integer(c(1:4, 3:6, 1,3,4,5)))

Моя двойная фильтрация:

d %>% 
  group_by(type) %>% 
  filter(all(keep.val %in% vals)) %>%   # need to get two filters: one to keep only group that have all values
  filter(vals %in% keep.val)            # second to keep only specific values

Мой желаемый вывод (теперь это правильно с двойной фильтрацией):

  type   vals
  <fct> <int>
1 a         1
2 a         3
3 d         1
4 d         3

Мне было интересно, есть ли способ сделать filter только один раз, и уточнить, где я фильтрую за что? В основном на будущее я оглядываюсь назад в коде:)

Ответы [ 3 ]

1 голос
/ 06 апреля 2020

Вы можете объединить два filter:

library(dplyr)

d %>%
  group_by(type) %>% 
  filter(all(keep.val %in% vals) & vals %in% keep.val)
  #filter(all(keep.val %in% vals), vals %in% keep.val)


#  type   vals
#  <fct> <int>
#1 a         1
#2 a         3
#3 d         1
#4 d         3
1 голос
/ 06 апреля 2020

Вы можете сделать это за один звонок filter с &. Не то чтобы это было намного лучше.

d %>% 
   group_by(type) %>% 
   filter(all(keep.val %in% vals) & (vals %in% keep.val))
0 голосов
/ 06 апреля 2020

С data.table

library(data.table)
setDT(d)[,.SD[all(keep.val %in% vals) & (vals %in% keep.val)] , type]

Или с использованием slice in dplyr

library(dplyr)
d %>%
   group_by(type) %>%
   slice(which(all(keep.val %in% vals) & vals %in% keep.val))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...