如何在dplyr中每n行非随机采样?

daj*_*daj 0 r subsampling dplyr

我想sample_n()在dplyr中做,除了我不希望采样是随机的,我打算每隔n行采样一次.

有没有办法做到这一点?

例如,我想获得的每10行airquality通过订购后的数据集MonthDay.预期产量:

   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)

jmk*_*jmk 6

您真的希望使用序列进行子集化.

mtcars[seq(1, nrow(mtcars), 10), ]

mtcarsdata.frame 替换两个出现,并替换10为要提取的第n行


sal*_*adi 6

如果您有要采样的有序数据的数据框,您可以过滤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),但并不总是有这么好的数字可以使用!