фильтрация с оператором if и условиями: труба dplyr - PullRequest
1 голос
/ 12 октября 2019

Я пытаюсь отфильтровать свои данные так, чтобы в некоторые даты у меня было слишком много наблюдений, и я хочу вырезать некоторые из них. Например, в приведенных ниже данных для 2005-03-31 164 наблюдений, что несколько искажает мои результаты. То, что я сделал, это вычислил какой-то метод ранжирования cosine_ntile, который идет от 1: 5. Для наблюдений, у которых «слишком много» наблюдений, меня интересует только верхний нитил, поэтому я сгруппировал по cosine_ntile и создал больше нитилей, называемых cosine_ntile_ntile.

Теперь меня интересует только нитил1 из cosine_ntile_ntile , если например, количество наблюдений превышает 100. Я попробовал filter(total_obs > 100 & cosine_ntile_ntile == 1), который не дает желаемого результата.

Я пытаюсь отфильтровать , если total_obs больше 100, а затем удалить наблюдения, которые имеют оценку 2 , 3 , 4 или 5 в столбце cosine_ntile_ntile.

Данные выглядят следующим образом:

# A tibble: 200 x 4
   filing_date_EoM total_obs cosine_ntile cosine_ntile_ntile
   <date>              <int>        <dbl>              <int>
 1 2005-07-31              6            1                  4
 2 2005-09-30             15            4                  2
 3 2005-03-31            164            1                  4
 4 2005-12-31             14            2                  3
 5 2005-11-30              5            5                  4
 6 2005-03-31            164            4                  3
 7 2005-12-31             14            5                  5
 8 2005-12-31             14            2                  4
 9 2005-03-31            164            1                  5
10 2005-02-28             17            3                  3

Данные:

structure(list(filing_date_EoM = structure(c(12995, 13056, 12873, 
13148, 13117, 12873, 13148, 13148, 12873, 12842, 12964, 12934, 
12873, 12964, 12842, 13117, 12873, 12873, 12903, 13148, 13117, 
12873, 12873, 13056, 12873, 12934, 12873, 12842, 12873, 12842, 
12814, 12873, 12995, 12873, 12873, 13056, 12873, 12903, 12873, 
13148, 13056, 12964, 13026, 13056, 12903, 12903, 12873, 12903, 
12873, 12873, 12873, 12873, 12842, 13148, 12842, 13026, 12934, 
13117, 13026, 12873, 13026, 13056, 12873, 12903, 12873, 12873, 
12873, 13117, 12873, 12873, 12873, 12964, 12873, 13148, 12873, 
12903, 12873, 12873, 13056, 12873, 13087, 12873, 12873, 12873, 
12903, 12873, 12873, 12873, 12873, 12873, 12873, 12873, 13056, 
13026, 12873, 12873, 12903, 12903, 13117, 12873, 12873, 12873, 
12873, 12903, 12964, 12873, 12873, 13056, 12873, 12873, 12995, 
12873, 12995, 12873, 12873, 12873, 12873, 12814, 12873, 12873, 
12995, 12873, 12873, 13148, 12814, 12873, 12873, 12903, 12873, 
12873, 12842, 12842, 12873, 13148, 12873, 12873, 13148, 12873, 
12842, 13056, 12964, 13056, 13148, 12873, 12873, 12873, 12903, 
12964, 12873, 12873, 12873, 13056, 12964, 12873, 12995, 12873, 
13148, 13148, 12934, 12873, 12873, 13026, 12873, 12873, 12873, 
12842, 12873, 12873, 12873, 12873, 12873, 13148, 12903, 12873, 
12873, 12873, 12873, 12873, 12873, 12873, 13056, 12873, 12814, 
12873, 12964, 12842, 12842, 12873, 13056, 12842, 12873, 12873, 
12873, 12873, 12873, 13117, 13026, 12873, 12903, 12873), class = "Date"), 
    total_obs = c(6L, 15L, 164L, 14L, 5L, 164L, 14L, 14L, 164L, 
    17L, 13L, 5L, 163L, 13L, 17L, 5L, 164L, 164L, 13L, 14L, 6L, 
    164L, 164L, 15L, 163L, 5L, 164L, 17L, 164L, 17L, 4L, 164L, 
    5L, 164L, 164L, 16L, 164L, 13L, 164L, 15L, 15L, 14L, 4L, 
    15L, 13L, 12L, 164L, 13L, 164L, 164L, 163L, 163L, 17L, 14L, 
    17L, 4L, 5L, 5L, 4L, 164L, 5L, 16L, 164L, 13L, 164L, 164L, 
    164L, 5L, 164L, 163L, 164L, 13L, 164L, 15L, 164L, 13L, 164L, 
    164L, 15L, 164L, 3L, 164L, 164L, 164L, 12L, 164L, 164L, 164L, 
    164L, 164L, 163L, 164L, 15L, 4L, 164L, 164L, 12L, 13L, 6L, 
    164L, 164L, 163L, 163L, 13L, 14L, 163L, 164L, 15L, 163L, 
    164L, 6L, 164L, 6L, 164L, 164L, 163L, 164L, 4L, 164L, 163L, 
    6L, 164L, 164L, 14L, 4L, 164L, 164L, 13L, 163L, 163L, 17L, 
    17L, 164L, 15L, 164L, 164L, 14L, 164L, 17L, 15L, 14L, 16L, 
    14L, 164L, 164L, 163L, 13L, 13L, 164L, 164L, 164L, 15L, 13L, 
    164L, 5L, 164L, 15L, 14L, 5L, 164L, 164L, 5L, 164L, 163L, 
    164L, 17L, 164L, 163L, 164L, 164L, 164L, 15L, 13L, 164L, 
    163L, 164L, 164L, 163L, 164L, 164L, 15L, 163L, 4L, 164L, 
    14L, 17L, 17L, 164L, 15L, 17L, 164L, 164L, 164L, 163L, 164L, 
    5L, 5L, 164L, 12L, 163L), cosine_ntile = c(1, 4, 1, 2, 5, 
    4, 5, 2, 1, 3, 2, 3, 5, 5, 5, 2, 2, 2, 4, 4, 1, 2, 1, 4, 
    5, 1, 1, 1, 1, 3, 1, 3, 2, 1, 3, 1, 4, 2, 1, 1, 4, 3, 4, 
    3, 4, 5, 2, 2, 2, 1, 5, 5, 5, 4, 3, 2, 2, 5, 2, 3, 1, 1, 
    1, 2, 2, 2, 3, 5, 1, 5, 4, 2, 3, 1, 2, 1, 3, 3, 3, 1, 5, 
    1, 4, 3, 5, 1, 1, 4, 4, 4, 5, 4, 2, 5, 2, 1, 5, 4, 1, 3, 
    1, 5, 5, 2, 1, 5, 4, 4, 5, 4, 1, 1, 3, 1, 2, 5, 2, 4, 1, 
    5, 1, 1, 4, 3, 5, 1, 2, 2, 5, 5, 2, 2, 4, 1, 2, 2, 3, 1, 
    2, 3, 3, 1, 2, 4, 1, 5, 1, 5, 2, 1, 3, 3, 4, 3, 4, 2, 1, 
    4, 4, 3, 4, 3, 2, 5, 3, 2, 3, 5, 2, 2, 4, 1, 2, 1, 5, 3, 
    2, 5, 1, 4, 4, 5, 3, 1, 3, 2, 2, 2, 2, 4, 2, 4, 2, 5, 1, 
    4, 1, 1, 5, 5), cosine_ntile_ntile = c(4L, 2L, 4L, 3L, 4L, 
    3L, 5L, 4L, 5L, 3L, 4L, 3L, 3L, 4L, 1L, 1L, 3L, 1L, 3L, 1L, 
    5L, 4L, 3L, 2L, 2L, 4L, 5L, 2L, 2L, 1L, 1L, 5L, 4L, 3L, 4L, 
    1L, 1L, 3L, 4L, 4L, 3L, 2L, 3L, 4L, 1L, 2L, 4L, 1L, 2L, 2L, 
    2L, 1L, 2L, 3L, 2L, 2L, 2L, 3L, 3L, 2L, 1L, 4L, 4L, 5L, 2L, 
    1L, 4L, 1L, 1L, 2L, 4L, 3L, 4L, 2L, 3L, 2L, 2L, 5L, 3L, 1L, 
    2L, 2L, 4L, 1L, 5L, 1L, 4L, 2L, 1L, 3L, 2L, 3L, 3L, 4L, 1L, 
    5L, 1L, 2L, 3L, 4L, 4L, 3L, 1L, 2L, 2L, 1L, 1L, 5L, 1L, 2L, 
    3L, 5L, 3L, 2L, 1L, 5L, 3L, 2L, 2L, 2L, 2L, 2L, 5L, 1L, 3L, 
    3L, 5L, 4L, 4L, 5L, 2L, 5L, 4L, 1L, 4L, 1L, 1L, 2L, 5L, 2L, 
    3L, 3L, 5L, 3L, 2L, 1L, 1L, 2L, 4L, 2L, 5L, 2L, 3L, 4L, 1L, 
    4L, 1L, 2L, 4L, 1L, 3L, 1L, 5L, 3L, 2L, 1L, 5L, 1L, 4L, 3L, 
    2L, 3L, 1L, 5L, 1L, 2L, 1L, 2L, 3L, 1L, 5L, 3L, 1L, 2L, 3L, 
    1L, 3L, 4L, 4L, 4L, 1L, 2L, 1L, 1L, 1L, 5L, 5L, 2L, 1L, 5L
    )), class = c("tbl_df", "tbl", "data.frame"), row.names = c(NA, 
-200L))

РЕДАКТИРОВАТЬ: Ожидаемый результат:

    filing_date_EoM total_obs cosine_ntile cosine_ntile_ntile
1        2005-07-31         6            1                  4
2        2005-09-30        15            4                  2
3        2005-03-31       164            1                  4  ~Gets removed
4        2005-12-31        14            2                  3
5        2005-11-30         5            5                  4
6        2005-03-31       164            4                  3 ~Gets removed
7        2005-12-31        14            5                  5
8        2005-12-31        14            2                  4
9        2005-03-31       164            1                  5 ~Gets removed
10       2005-02-28        17            3                  3
11       2005-06-30        13            2                  4
12       2005-05-31         5            3                  3
13       2005-03-31       163            5                  3 ~Gets removed
14       2005-06-30        13            5                  4
15       2005-02-28        17            5                  1
16       2005-11-30         5            2                  1
17       2005-03-31       164            2                  3 ~Gets removed
18       2005-03-31       164            2                  1 ~STAYS
19       2005-04-30        13            4                  3
20       2005-12-31        14            4                  1
21       2005-11-30         6            1                  5
22       2005-03-31       164            2                  4 ~Gets removed
23       2005-03-31       164            1                  3 ~Gets removed
24       2005-09-30        15            4                  2
25       2005-03-31       163            5                  2 ~Gets removed
26       2005-05-31         5            1                  4
27       2005-03-31       164            1                  5 ~Gets removed
28       2005-02-28        17            1                  2
29       2005-03-31       164            1                  2 ~Gets removed
30       2005-02-28        17            3                  1
31       2005-01-31         4            1                  1
32       2005-03-31       164            3                  5 ~Gets removed
33       2005-07-31         5            2                  4
34       2005-03-31       164            1                  3 ~Gets removed
35       2005-03-31       164            3                  4 ~Gets removed
36       2005-09-30        16            1                  1
37       2005-03-31       164            4                  1 ~STAYS
38       2005-04-30        13            2                  3
39       2005-03-31       164            1                  4 ~Gets removed
40       2005-12-31        15            1                  4
41       2005-09-30        15            4                  3
42       2005-06-30        14            3                  2
43       2005-08-31         4            4                  3
44       2005-09-30        15            3                  4
45       2005-04-30        13            4                  1

Наблюдения 18 остается, потому что total_obs> 100 и в cosine_ntile_ntile= 1. Остальные наблюдения, которые не выполняются при первом условии, то есть будучи <100, также остаются (или не предпринимаются действия). </p>

1 Ответ

1 голос
/ 12 октября 2019

Мы можем создать filter и отрицать (!)

library(dplyr)
df2 <-  df1 %>%
    filter(!(total_obs > 100 & cosine_ntile_ntile != 1))

- проверку вывода

df2 %>%
   filter(total_obs > 100, cosine_ntile_ntile != 1)
# A tibble: 0 x 4
# … with 4 variables: filing_date_EoM <date>, total_obs <int>, cosine_ntile <dbl>, cosine_ntile_ntile <int>

Или используя subset из base R

subset(df1, !(total_obs > 100 & cosine_ntile_ntile != 1))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...