从大数据框中抽取小数据框进行采样

3
我将尝试从给定数据框中对其进行抽样,以便每个变量级别都有足够的样本。 这可以通过按级别分离数据帧并从每个级别抽样来实现。 我认为ddply(数据帧到数据帧)可以帮助我完成此操作。 以下是一个最小化的示例:
set.seed(1)
data1 <-data.frame(a=sample(c('B0','B1','B2'),100,replace=TRUE),b=rnorm(100),c=runif(100))
> summary(data1$a)
B0 B1 B2 
30 32 38

以下命令执行抽样...
当我输入时...
data2 <- ddply(data1,c('a'),function(x) sample(x,20,replace=FALSE))

我遇到了以下错误

[.data.frame(x, .Internal(sample(length(x), size, replace, : 当'replace = FALSE'时不能对整个人群进行大于样本量的抽样

这个错误是因为ddply函数中的x不是向量,而是数据框。

有没有人知道如何实现这个采样呢? 我知道一种方法是不使用ddply,而是分为三个步骤:(1) 分离,(2) 采样,和(3) 合并。但是我想知道是否有一些方法...可以使用基础或者plyr函数...

感谢您的帮助...


你应该使用 sample(nrow(x)) - Andrie
2个回答

6

我认为您想要的是使用sample对传入的数据框x进行子集化:

ddply(data1,.(a),function(x) x[sample(nrow(x),20,replace = FALSE),])

当然,您仍需要确保每个部分的样本大小(在此例中为20)至少与基于a级别的数据最小子集的大小相同。


3
看起来,如果您想对少于20行的类别进行采样,您需要使用replace=TRUE...

这可能会有帮助:
ddply(data1,'a',function(x) x[sample.int(NROW(x),20,replace=TRUE),])

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接