daj*_*daj 0 r subsampling dplyr
我想sample_n()在dplyr中做,除了我不希望采样是随机的,我打算每隔n行采样一次.
有没有办法做到这一点?
例如,我想获得的每10行airquality通过订购后的数据集Month和Day.预期产量:
Ozone Solar.R Wind Temp Month Day
NA 194 8.6 69 5 10
11 44 9.7 62 5 20
115 223 5.7 79 5 30
71 291 13.8 90 6 9
12 120 11.5 73 6 19
NA 31 14.9 77 6 29
...
Run Code Online (Sandbox Code Playgroud)
您真的希望使用序列进行子集化.
mtcars[seq(1, nrow(mtcars), 10), ]
用mtcarsdata.frame 替换两个出现,并替换10为要提取的第n行
如果您有要采样的有序数据的数据框,您可以过滤row_number:
library(tidyverse)
airquality %>%
arrange(Month, Day) %>%
filter(row_number() %% 10 == 0) %>%
head()
#> Ozone Solar.R Wind Temp Month Day
#> 1 NA 194 8.6 69 5 10
#> 2 11 44 9.7 62 5 20
#> 3 115 223 5.7 79 5 30
#> 4 71 291 13.8 90 6 9
#> 5 12 120 11.5 73 6 19
#> 6 NA 31 14.9 77 6 29
Run Code Online (Sandbox Code Playgroud)
由于每个月未分组,因此保留每个第 10 行(这意味着Day从 10 秒变为 9 秒)。分组方式Month解决了这个问题:
airquality %>%
arrange(Month, Day) %>%
group_by(Month) %>%
filter(row_number() %% 10 == 0) %>%
head()
#> # A tibble: 6 x 6
#> # Groups: Month [2]
#> Ozone Solar.R Wind Temp Month Day
#> <int> <int> <dbl> <int> <int> <int>
#> 1 NA 194 8.60 69 5 10
#> 2 11 44 9.70 62 5 20
#> 3 115 223 5.70 79 5 30
#> 4 39 323 11.5 87 6 10
#> 5 13 137 10.3 76 6 20
#> 6 NA 138 8.00 83 6 30
Run Code Online (Sandbox Code Playgroud)
当然,我们可以只使用filter(Day %% 10 == 0),但并不总是有这么好的数字可以使用!