R:具有不同样本大小的样本

R: sample with different sample sizes for groups

我有一个包含 2 个分组列 V1 和 V2 的数据框。我想为 V1 中的每个不同值精确地采样 n = 4 个元素,并确保对 V2 中的每个不同元素至少采样 m = 1。

library(tidyverse)
set.seed(1)
df = data.frame(
  V1 = c(rep("A",6), rep("B",6)),
  V2 = c("C","C","D","D","E","E","F","F","G","G","H","H"),
  V3 = rnorm(12)
)

df
   V1 V2         V3
1   A  C -0.6264538
2   A  C  0.1836433
3   A  D -0.8356286
4   A  D  1.5952808
5   A  E  0.3295078
6   A  E -0.8204684
7   B  F  0.4874291
8   B  F  0.7383247
9   B  G  0.5757814
10  B  G -0.3053884
11  B  H  1.5117812
12  B  H  0.3898432

我想要的输出例如是...

V1    V2        V3
1 A     C     -0.626
2 A     D     -0.836
3 A     E     -0.820
4 A     E      0.329
5 B     F      0.487
6 B     G      0.576
7 B     G     -0.305
8 B     H      0.390

我不知道如何生成此输出。当我按 V1 和 V2 分组时,我为 V1 中的每个不同值得到 n = 3 个元素。

df %>%
  group_by(V1,V2) %>%
  sample_n(1)

  V1    V2        V3
1 A     C     -0.626
2 A     D     -0.836
3 A     E     -0.820
4 B     F      0.487
5 B     G      0.576
6 B     H      0.390

“splitstackshape”或“sampling”包没有帮助。

这是一种方法:

library(dplyr)

nr <- 4
first_pass <- df %>% group_by(V1, V2) %>% sample_n(1) %>% ungroup

first_pass %>% 
  count(V1) %>% 
  mutate(n = nr - n) %>%
  left_join(df, by = 'V1') %>%
  group_by(V1) %>%
  sample_n(first(n)) %>%
  select(-n) %>%
  bind_rows(first_pass) %>%
  arrange(V1, V2)

#  V1    V2        V3
#  <chr> <chr>  <dbl>
#1 A     C      0.184
#2 A     D     -0.836
#3 A     E     -0.820
#4 A     E     -0.820
#5 B     F      0.487
#6 B     F      0.738
#7 B     G     -0.305
#8 B     H      0.390

逻辑是首先随机 select 1 行,每个 V1V2。然后,我们为每个 V1 计算我们需要多少行才能获得 nr 行,并从每个 V1 中随机抽取它们并组合最终数据集。