2012-03-28 77 views
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)) 

我收到以下錯誤

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

你應該使用'sample(nrow(x))' – Andrie 2012-03-28 17:56:33

回答

5

我想你想要的是子集x傳遞的數據幀使用sample

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

但是,當然,你仍然是你的最小數據集根據需要照顧的樣品,每件的尺寸(在這種情況下20)至少一樣大a的等級。

+0

+1來擊敗我,但不到一分鐘... – Tommy 2012-03-28 18:02:13

3

這似乎是,如果你想品嚐有不到20行的類別,你就需要更換= TRUE ...

這可能做的伎倆:

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

+1的函數sample.int @Tommy – 2012-03-28 18:18:52