从数据 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)
,因此每个组都有重复的行号。然后,当您对其进行子集化时它不起作用,请在上面的输出中查看 gear
组 3
和 4
.
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)