0

我有一个这样的数据框:

         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 岁的,我没有收到任何错误,但那些行不会消失。

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

提前致谢

4

2 回答 2

3

这是一个基本的 R 解决方案和一个tidyverse解决方案。R 的部分优势在于,对于此类问题,R 默认跨向量工作意味着您通常不需要 for 循环。问题是在您的循环中,您将值分配给NA. 这实际上并没有摆脱这些值,它只是赋予它们 value 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(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
于 2018-06-09T16:03:56.797 回答
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
于 2018-06-09T14:46:55.497 回答