【问题标题】:How to non-randomly sample every n rows in dplyr?如何在 dplyr 中每 n 行非随机采样?
【发布时间】: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

    ...

【问题讨论】:

    标签: r dplyr subsampling


    【解决方案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)) ) 
      

      【讨论】:

        猜你喜欢
        • 2014-07-12
        • 2021-02-11
        • 1970-01-01
        • 1970-01-01
        • 2021-10-06
        • 1970-01-01
        • 2020-04-23
        • 1970-01-01
        • 2012-01-06
        相关资源
        最近更新 更多