我试图从给定的数据帧中采样数据帧,以便从变量的每个级别获得足够的样本。
这可以通过将数据帧与每个级别和样本分开来实现。
我认为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
函数......
感谢您的帮助......
答案 0 :(得分:5)
我认为你想要的是使用x
对sample
中传递的数据框进行子集化:
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),])