如何对R中具有相同种子的行进行分组重采样?

3htmauhk  于 2023-03-20  发布在  其他
关注(0)|答案(1)|浏览(91)

我想按组(name列)对数据集进行重采样。例如:

names <- c(rep("a", 3), rep("b", 3), rep("c", 3)) 
test <- tibble(name = names, number = rep(c(1:3), 3))
test
  name number
  <chr> <int>
1 a         1
2 a         2
3 a         3
4 b         1
5 b         2
6 b         3
7 c         1
8 c         2
9 c         3

我知道tidyverse中有一个slice_sample,但我注意到它不能设置seed来使每个组都有相同的重采样结果(number)。我想知道我如何在每个name中用replacement对行进行重采样,并且每个组也可以有相同的结果(1-2-2),就像下面的预期输出一样?

name number
1 a         1
2 a         2
3 a         2
4 b         1
5 b         2
6 b         2
7 c         1
8 c         2
9 c         2

谢谢大家!

vjrehmav

vjrehmav1#

要对每组相同的行索引进行采样,您可以先生成索引,然后将其传递给slice()。这可能是不必要的,但我们可以将其封装在一个函数中,该函数检查各组是否大小相等。

library(dplyr)

slice_same_idx <- function(data, group = group) {
  n <- data %>%
    group_by({{group}}) %>%
    group_size()
  
  stopifnot("Unequal group sizes" = n_distinct(n) == 1)
  
  idx <- sample(n[1], replace = TRUE)
  
  data %>%
    slice(idx, .by = {{group}})
}

test %>%
  slice_same_idx(name)

# A tibble: 9 × 2
  name  number
  <chr>  <int>
1 a          3
2 a          1
3 a          1
4 b          3
5 b          1
6 b          1
7 c          3
8 c          1
9 c          1

相关问题