通过过滤 R 中的值来移除异常值
Removing outliers by filtering values in R
我有一个这样的数据框:
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 以下的那些,我没有收到任何错误,但那些行不会。
关于如何删除这些异常值有什么建议吗??
提前致谢
使用 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
这里有一个基本的 R 解决方案和一个 tidyverse
解决方案。 R 的部分优势在于,对于此类问题,R 默认跨向量工作意味着您通常不需要 for 循环。问题是在您的循环中,您正在为 NA
赋值。这实际上并没有摆脱这些价值,它只是给他们价值 NA
.
在 base 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
的 shorthand。
library(dplyr)
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
我有一个这样的数据框:
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 以下的那些,我没有收到任何错误,但那些行不会。
关于如何删除这些异常值有什么建议吗??
提前致谢
使用 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
这里有一个基本的 R 解决方案和一个 tidyverse
解决方案。 R 的部分优势在于,对于此类问题,R 默认跨向量工作意味着您通常不需要 for 循环。问题是在您的循环中,您正在为 NA
赋值。这实际上并没有摆脱这些价值,它只是给他们价值 NA
.
在 base 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
的 shorthand。
library(dplyr)
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