1

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

有没有办法做到这一点?

例如,我想在按andairquality排序后获取数据集的每 10 行。预期输出: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

    ...
4

3 回答 3

6

您真的很想使用序列进行子集化。

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

mtcars用你的data.frame替换这两个事件,并用10你要提取的第n行替换

于 2015-06-17T07:39:48.960 回答
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

由于每个月没有分组,因此保留了每 10 行(这意味着Day从 10s 到 9s)。分组方式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),但并不总是有这么好的数字可以使用!

于 2018-03-23T08:44:03.880 回答
1

如果您打算对 data.frame 中的每 'n' 行进行采样并在每个 'n' 中获取 'n1' 行,请为每 '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)) ) 
于 2015-06-17T07:58:05.893 回答