Фильтровать разные переменные на основе разных условий - PullRequest
0 голосов
/ 01 мая 2018

У меня есть глубоко вложенные данные и функция, которая запускает их через мурлыканье. Вот фиктивные данные и анализ, которые напоминают мой случай:

df <- tibble::tribble(
     ~A, ~B, ~C,
    "e", 2L, 6L,
    "e", 5L, 8L,
    "e", 5L, 3L,
    "f", 3L, 8L,
    "f", 4L, 1L,
    "f", 5L, 6L,
    "g", 3L, 9L,
    "g", 4L, 2L,
    "g", 5L, 7L,
    "h", 5L, 4L
    )

Мне нужно отфильтровать разные переменные на основе разных условий. Мне нужно сделать что-то вроде этого:

df1 <- df %>% group_by(A) %>% 
              nest() %>% 
              case_when(A == "e" ~filter(B<4),
              A == "f" ~filter(C<=6),
              A == "g" ~filter(B<5, C<7))

Мой желаемый результат должен быть:

desired_output <- tibble::tribble(
                     ~A, ~B, ~C,
                    "e", 2L, 6L,
                    "f", 4L, 1L,
                    "f", 5L, 6L,
                    "g", 4L, 2L
                    )

Ответы [ 2 ]

0 голосов
/ 01 мая 2018

Опция может быть как:

df1 <- df %>% group_by(A) %>% 
  mutate(filterV = case_when(
    A == "e" ~ (B<4),
    A == "f" ~ (C<=6),
    A == "g" ~ (B<5 & C<7))) %>%
  filter(filterV) %>%
  select(-filterV)

df1
# # A tibble: 4 x 3
# # Groups: A [3]
#   A         B     C
#  <chr> <int> <int>
# 1 e         2     6
# 2 f         4     1
# 3 f         5     6
# 4 g         4     2
0 голосов
/ 01 мая 2018

Мы можем сделать следующее, чтобы отфильтровать для различных условий.

library(tidyverse)

df %>%
  filter((A %in% "e" & B < 4)  | 
           (A %in% "f" & C <= 6) |
           (A %in% "g" & B < 5 & C < 7))  
# # A tibble: 4 x 3
#   A         B     C
#   <chr> <int> <int>
# 1 e         2     6
# 2 f         4     1
# 3 f         5     6
# 4 g         4     2
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...