Удаление выбросов путем фильтрации значений в R - PullRequest
0 голосов
/ 09 июня 2018

У меня есть такой кадр данных:

         ds        y
1   2015-12-31 35.59050
2   2016-01-01 28.75111
3   2016-01-04 25.53158
4   2016-01-06 17.75369
5   2016-01-07 29.01500
6   2016-01-08 29.22663
7   2016-01-09 29.05249
8   2016-01-10 27.54387
9   2016-01-11 28.05674
10  2016-01-12 29.00901
11  2016-01-13 31.66441
12  2016-01-14 29.18520
13  2016-01-15 29.79364
14  2016-01-16 30.07852

Я пытаюсь создать цикл, который удаляет строки, значения которых в столбце 'ds' выше 34 или ниже 26, потому что есть гдемои выбросы:

for (i in grupo$y){if (i < 26) {grupo$y[i] = NA}}

я пробовал это, чтобы удалить те, кто ниже 26, я не получаю никаких ошибок, но эти строки не будут идти.

Любые предложения о том, как удалитьэти выбросы ??

Заранее спасибо

Ответы [ 2 ]

0 голосов
/ 09 июня 2018

Вот базовое решение R и tidyverse решение.Часть силы R в том, что для такой проблемы, как эта, R по умолчанию работает с векторами, что означает, что вам часто не нужен цикл for.Проблема в том, что в вашем цикле вы присваиваете значения NA.Это на самом деле не избавляет от этих значений, оно просто дает им значение NA.

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

subset(grupo, y >= 26 & y <= 34)
#> # A tibble: 11 x 2
#>    ds             y
#>    <date>     <dbl>
#>  1 2016-01-01  28.8
#>  2 2016-01-07  29.0
#>  3 2016-01-08  29.2
#>  4 2016-01-09  29.1
#>  5 2016-01-10  27.5
#>  6 2016-01-11  28.1
#>  7 2016-01-12  29.0
#>  8 2016-01-13  31.7
#>  9 2016-01-14  29.2
#> 10 2016-01-15  29.8
#> 11 2016-01-16  30.1

Или используя функции dplyr, вы можете аналогичным образом фильтровать данные и использовать dplyr::between.between(y, 26, 34) является сокращением для y >= 26 & y <= 34.

library(tidyverse)

grupo %>%
  filter(between(y, 26, 34))
#> # A tibble: 11 x 2
#>    ds             y
#>    <date>     <dbl>
#>  1 2016-01-01  28.8
#>  2 2016-01-07  29.0
#>  3 2016-01-08  29.2
#>  4 2016-01-09  29.1
#>  5 2016-01-10  27.5
#>  6 2016-01-11  28.1
#>  7 2016-01-12  29.0
#>  8 2016-01-13  31.7
#>  9 2016-01-14  29.2
#> 10 2016-01-15  29.8
#> 11 2016-01-16  30.1

Создано в 2018-06-09 пакетом Представить (v0.2.0).

0 голосов
/ 09 июня 2018

С dplyr вы можете сделать:

library(dplyr)
df %>% 
filter(y >= 26 & y <= 34)

       ds        y
1  2016-01-01 28.75111
2  2016-01-07 29.01500
3  2016-01-08 29.22663
4  2016-01-09 29.05249
5  2016-01-10 27.54387
6  2016-01-11 28.05674
7  2016-01-12 29.00901
8  2016-01-13 31.66441
9  2016-01-14 29.18520
10 2016-01-15 29.79364
11 2016-01-16 30.07852
...