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

Posted

技术标签:

【中文标题】如何在 dplyr 中每 n 行非随机采样?【英文标题】:How to non-randomly sample every n rows in dplyr? 【发布时间】:2015-09-02 07:15:48 【问题描述】:

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

有没有办法做到这一点?

例如,我想在按MonthDay 排序后获取airquality 数据集的每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

    ...

【问题讨论】:

【参考方案1】:

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

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

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

【讨论】:

我在问是否有办法在 dplyr 中做到这一点。你不能在链的中间这样做(好吧,你可以用“。”破解它)一般来说这样做是微不足道的。【参考方案2】:

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

【讨论】:

【参考方案3】:

如果您打算对 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)) ) 

【讨论】:

以上是关于如何在 dplyr 中每 n 行非随机采样?的主要内容,如果未能解决你的问题,请参考以下文章

在数据框中对每组随机采样 n 行

MATLAB如何产生随机信号?

如何在 Python scikit-learn 中输出随机森林中每棵树的回归预测?

如何在 Python scikit-learn 中输出随机森林中每棵树的回归预测?

如何在numpy的二维矩阵中随机采样

如何在保持数据分布的同时从python中的列表中随机采样