从大数据帧中采样小数据帧

时间:2012-03-28 17:53:59

标签: r plyr sampling

我试图从给定的数据帧中采样数据帧,以便从变量的每个级别获得足够的样本。 这可以通过将数据帧与每个级别和样本分开来实现。 我认为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))

我收到以下错误

   Error in `[.data.frame`(x, .Internal(sample(length(x), size, replace,  : 
  cannot take a sample larger than the population when 'replace = FALSE'

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

有没有人知道如何实现这种抽样? 我知道一种方法是不使用ddply而只是做(1)隔离,(2)采样,和(3)分三步进行整理。但我想知道必须通过某种方式......使用基础或plyr函数......

感谢您的帮助......

2 个答案:

答案 0 :(得分:5)

我认为你想要的是使用xsample中传递的数据框进行子集化:

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

但是,当然,您仍然需要注意每个部分(在这种情况下为20)的样本大小至少与基于{{1}级别的数据的最小子集一样大。 }。

答案 1 :(得分:3)

如果您想要对少于20行的类别进行采样,您需要替换= TRUE ...

这可能会起到作用:

ddply(data1,'a',function(x) x[sample.int(NROW(x),20,replace=TRUE),])