我有一个这样的数据框:
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以下的那些,我没有得到任何错误,但那些行不会去。
有关如何删除这些异常值的任何建议吗?
提前致谢
答案 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::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
由reprex package(v0.2.0)创建于2018-06-09。