从数据 frame_follow 向上分层随机抽样

Stratified random sampling from data frame_follow up

我正在尝试为 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 

我认为您采用的方法为每个 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)