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

时间:2015-06-17 07:31:50

标签: r dplyr subsampling

我想在dplyr中进行sample_n(),除非我不希望抽样是随机的,我打算每隔n行进行一次采样。

有办法做到这一点吗?

例如,我希望在按airqualityMonth排序后获取Day数据集的每第10行。预期产出:

   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

    ...

3 个答案:

答案 0 :(得分:6)

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

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

mtcars次出现替换为您的data.frame,并将10替换为您想要提取的第n行

答案 1 :(得分:1)

如果您打算对每个&n;' n' data.frame中的行并获取' n1'每个' n'中的行,为每个' n'创建一个分组变量。行并使用sample_n。 (这就是我的解释。随意纠正我)

library(dplyr)
n <- 6
n1 <- 3
df1 %>% 
    group_by(gr= as.numeric(gl(n(), n, n()))) %>%
    sample_n(.,n1)

数据

set.seed(24)
df1 <- as.data.frame(cbind(rn=1:40, matrix(sample(0:10,3*40, 
            replace=TRUE), ncol=3)) ) 

答案 2 :(得分:1)

如果您有想要抽样的有序数据的数据框,可以在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

由于每个月未分组,因此保留每个第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

当然,我们本来可以使用filter(Day %% 10 == 0),但是并不总是有这么好的数字可供使用!