Как отфильтровать целые группы, используя dplyr, которые имеют столбцы, удовлетворяющие определенному свойству? - PullRequest
0 голосов
/ 24 марта 2020

Используя mtcars в качестве примера: предположим, что я хотел удалить группы, основанные на столбце «carb», если какое-либо из наблюдений в группе имело «disp» меньше 100. Я знаю, как это сделать, используя базу R:

data(mtcars)
xx <- split (mtcars, as.factor (mtcars$carb))
xx <- xx[sapply (xx, function(x) min(x$disp) > 100)] 
xx <- do.call (rbind, xx)

но есть ли более элегантный способ сделать это с помощью dplyr?

Ответы [ 3 ]

1 голос
/ 24 марта 2020

Мы можем group_by carb и удалить группы, которые имеют любое значение меньше 100 для disp.

library(dplyr)
mtcars %>% group_by(carb) %>% filter(all(disp > 100))
#Or
#mtcars %>% group_by(carb) %>% filter(!any(disp < 100))


#     mpg   cyl  disp    hp  drat    wt  qsec    vs    am  gear  carb
#   <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
# 1  21       6  160    110  3.9   2.62  16.5     0     1     4     4
# 2  21       6  160    110  3.9   2.88  17.0     0     1     4     4
# 3  14.3     8  360    245  3.21  3.57  15.8     0     0     3     4
# 4  19.2     6  168.   123  3.92  3.44  18.3     1     0     4     4
# 5  17.8     6  168.   123  3.92  3.44  18.9     1     0     4     4
# 6  16.4     8  276.   180  3.07  4.07  17.4     0     0     3     3
# 7  17.3     8  276.   180  3.07  3.73  17.6     0     0     3     3
# 8  15.2     8  276.   180  3.07  3.78  18       0     0     3     3
# 9  10.4     8  472    205  2.93  5.25  18.0     0     0     3     4
#10  10.4     8  460    215  3     5.42  17.8     0     0     3     4
#11  14.7     8  440    230  3.23  5.34  17.4     0     0     3     4
#12  13.3     8  350    245  3.73  3.84  15.4     0     0     3     4
#13  15.8     8  351    264  4.22  3.17  14.5     0     1     5     4
#14  19.7     6  145    175  3.62  2.77  15.5     0     1     5     6
#15  15       8  301    335  3.54  3.57  14.6     0     1     5     8
0 голосов
/ 24 марта 2020

Мы можем использовать data.table

library(data.table)
as.data.table(mtcars)[, .SD[all(disp > 100)], carb]
0 голосов
/ 24 марта 2020

Вы можете сделать это, сгруппировав наблюдения по carb, создав новую переменную min_disp, которая показывает минимальное смещение на группу, и затем отфильтровав min_disp> 100:

mtcars %>%
  group_by(carb) %>%
  mutate(min_disp = min(disp)) %>%
  ungroup() %>%
  filter(min_disp > 100)

(я рекомендую пошаговый запуск кода, чтобы вы могли видеть, что происходит)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...