通过过滤R中的值来删除异常值

时间:2018-06-09 14:13:11

标签: r outliers facebook-prophet

我有一个这样的数据框:

         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 :(得分:2)

使用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

答案 1 :(得分:2)

以下是基础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::betweenbetween(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

reprex package(v0.2.0)创建于2018-06-09。