【问题标题】:Stratified random sampling from data frame_follow up来自数据帧_follow up 的分层随机抽样
【发布时间】:2020-06-24 12:52:08
【问题描述】:

我正在尝试为Stratified random sampling from data frame 之后的每个组随机抽取 50% 的数据。在 R 中使用 mtcars 数据集的可重现示例如下所示。我不明白的是,样本索引清楚地显示了一组标记为'5'的齿轮,但是当索引应用于mtcars数据集时,采样数据mtcars2不包含来自gear='5'的任何记录。什么地方出了错?非常感谢。

> set.seed(14908141)
> index=tapply(1:nrow(mtcars),mtcars$gear,function(x){sample(length(x),length(x)*0.5)})
> index
$`3`
[1]  6  7 14  4 12  9 13

$`4`
[1] 12  7  8  4  6  5

$`5`
[1] 5 1

> mtcars2=mtcars[unlist(index),]
> table(mtcars2$gear)

 3  4 
12  3 

【问题讨论】:

    标签: r random sampling


    【解决方案1】:

    我认为您使用的方法为每个 gear 组创建了一个编号 1:length(mtcars$gear),因此您将拥有每个组的重复行号。然后,当您对其子集不起作用时,请在上面的输出中查看您在gear34 中都有行号7

    基础 R

    我会先用split按齿轮分割:

    res <- split(mtcars, mtcars$gear)
    

    然后我使用lapply 遍历此列表并以这种方式对其中的 50% 进行采样:

    res2 <- lapply(res, function(x) {
      x[sample(1:nrow(x), nrow(x)*0.5, FALSE), ]
        }
    )
    

    如果您想在末尾添加一个数据集(而不是列表),您可以使用 do.call 进行组合:

    final_df <- do.call(rbind, res2)
    

    dplyr

    更简单的方法是:

    library(dplyr)
    mtcars %>% 
      group_by(gear) %>% 
      sample_frac(., 0.5)
    

    【讨论】:

    • 非常感谢您的快速回复。我注意到同一记录包含在多个组中的问题。是否可以使用 tapply() 或其他一些基本 R 函数更正我上面的代码?
    • 查看上面的基本类型解决方案
    • do.call(),这正是我需要的,非常感谢。
    猜你喜欢
    • 2014-06-22
    • 2019-09-20
    • 2023-02-14
    • 2015-08-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多