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

问题描述 投票:0回答:2

我有这样的数据帧:

         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以下的那些,我没有得到任何错误,但这些行不会去。

有关如何删除这些异常值的任何建议??

提前致谢

r outliers facebook-prophet
2个回答
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

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创建于2018-06-09(v0.2.0)。

© www.soinside.com 2019 - 2024. All rights reserved.