bootstrap 按小标题分组

bootstrap by group in tibble

假设我有一个 tibble tbl_

tbl_ <- tibble(id = c(1,1,2,2,3,3), dta = 1:6)
tbl_
# A tibble: 6 x 2
     id   dta
  <dbl> <int>
1     1     1
2     1     2
3     2     3
4     2     4
5     3     5
6     3     6

有3个id组。我想通过替换对整个 id 组重新采样 3 次。例如,生成的 tibble 可以是:

     id   dta
  <dbl> <int>
1     1     1
2     1     2
3     1     1
4     1     2
5     3     5
6     3     6

不是

     id   dta
  <dbl> <int>
1     1     1
2     1     2
3     1     1
4     2     4
5     3     5
6     3     6

     id   dta
  <dbl> <int>
1     1     1
2     1     1
3     2     3
4     2     4
5     3     5
6     3     6

一个选项可以是获取每个 idminimum 行号。该行号将用于从 replace = TRUE.

生成随机样本
library(dplyr)

tbl_ %>% mutate(rn = row_number()) %>%
  group_by(id) %>%
  summarise(minrow = min(rn)) ->min_row

indx <- rep(sample(min_row$minrow, nrow(min_row), replace = TRUE), each = 2) + 
        rep(c(0,1), 3)

tbl_[indx,]
# # A tibble: 6 x 2
#    id     dta
#   <dbl>  <int>
# 1  1.00     1
# 2  1.00     2
# 3  3.00     5
# 4  3.00     6
# 5  2.00     3
# 6  2.00     4

注意: 在上面的答案中,每个 id 的行数已假定为 2,但此答案可以处理任意数量的 ID。硬编码的 each=2c(0,1) 需要修改,以便将其扩展为每个 id

处理超过 2 行

这是 sample_ndistinct

的一个选项
library(tidyverse)
distinct(tbl_, id) %>% 
    sample_n(nrow(.), replace = TRUE) %>% 
    pull(id) %>% 
    map_df( ~ tbl_ %>% 
         filter(id == .x)) %>%
    arrange(id)
# A tibble: 6 x 2
#     id   dta
#  <dbl> <int>
#1  1.00     1
#2  1.00     2
#3  1.00     1
#4  1.00     2
#5  3.00     5
#6  3.00     6