【问题标题】:Random sampling by category, different number of samples needed per category in R [duplicate]按类别随机抽样,R中每个类别需要不同数量的样本[重复]
【发布时间】:2020-04-24 06:43:48
【问题描述】:

我有一个问题要在 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中表示。

【问题讨论】:

    标签: r random


    【解决方案1】:

    我们可以通过'loc'split第一个数据集,使用map2循环第二个数据集中对应的'n'和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))
    

    【讨论】:

    • 我尝试了这个,但我得到了错误:映射向量必须具有一致的长度:.x 的长度为 28,.y 的长度为 29。
    • @coconn41 根据您显示的数据,我没有收到任何错误。请查看我帖子中的data
    • 我很抱歉,有一个额外的观察。我现在纠正了它。相反,我得到一个错误“大小”必须小于或等于 3(数据大小),设置“替换”= TRUE 以使用带替换的采样。但是,匹配选项对我很有效!
    • @coconn41 你能用一个新的例子更新你的帖子吗
    猜你喜欢
    • 2021-02-27
    • 2020-04-01
    • 2018-07-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-01-20
    • 2022-12-17
    • 2017-05-11
    相关资源
    最近更新 更多