首页 > 解决方案 > 按类别随机抽样,R中每个类别需要不同数量的样本

问题描述

我有一个问题要在 R 中进行一些随机抽样。我有两个数据集。一个数据集,比如 df1,被组织起来,其中每个观察都是一个样本,并且收集样本的位置在变量“loc”下。“loc”设置为字符。下面显示了一个示例数据布局。

    ID loc x1 x2 x3 
    1  A   x  x  x
    2  A   x  x  x
    3  A   x  x  x
    4  B   x  x  x
    5  B   x  x  x 
    6  C   x  x  x 
    7  C   x  x  x 
    8  C   x  x  x
    9  C   x  x  x
    etc.

第二个数据集,比如 df2,是所有位置的列表以及每个位置所需的随机样本数。它看起来像这样:

    loc n
    A   2
    B   1
    C   3

我想知道如何按组获取不同数量的随机样本,其中所需的样本数在 df2.

标签: rrandom

解决方案


我们可以split通过'loc'来使用第一个数据集,使用第二个数据集中对应的'n'map2循环list并使用它sample_n

library(purrr)
library(dplyr)
map2_dfr(df1 %>% 
            group_split(loc), df2$n, ~ .x %>% 
                                         sample_n(.y))
# A tibble: 6 x 5
#     ID loc   x1    x2    x3   
#  <int> <chr> <chr> <chr> <chr>
#1     1 A     x     x     x    
#2     2 A     x     x     x    
#3     5 B     x     x     x    
#4     6 C     x     x     x    
#5     8 C     x     x     x    
#6     7 C     x     x     x    

或者另一种选择是match

df1 %>% 
      group_by(loc) %>%
      sample_n(df2$n[match(first(loc), df2$loc)])

数据

df1 <- structure(list(ID = 1:9, loc = c("A", "A", "A", "B", "B", "C", 
"C", "C", "C"), x1 = c("x", "x", "x", "x", "x", "x", "x", "x", 
"x"), x2 = c("x", "x", "x", "x", "x", "x", "x", "x", "x"), x3 = c("x", 
"x", "x", "x", "x", "x", "x", "x", "x")), class = "data.frame", 
row.names = c(NA, 
-9L))

df2 <- structure(list(loc = c("A", "B", "C"), n = c(2L, 1L, 3L)),
   class = "data.frame", row.names = c(NA, 
-3L))

推荐阅读