2015-07-20 82 views
1

我想創建一個非常大(大約200萬行)的data.tabledf的隨機子集。 數據表有一個權重列wgt,它表示每條線代表多少個觀察值。 爲了產生行數我想提取的矢量,我的步驟如下:sample()命令太慢R

我得到觀測的確切數目:

ns<- length(df$wgt) 

我得到所需的行的數量(樣本的30% ):

lines<-round(0.3*ns) 

我計算概率的矢量:

pr<-df$wgt/sum(df$wgt) 

然後我計算行號的矢量,以獲得子樣本:

ssout<-sample(1:ns, size=lines, probs=pr) 

最終目標是使用df[ssout,]到子集的數據。然而,R在計算ssout時卡住了。

有沒有更快/更有效的方法來做到這一點?

謝謝!

+1

如果指定了所有的參數,使用'sample.int'將會修剪一點點,這也會迫使你首先不*創建'1:ns'向量(就像跳過建議的@DavidArenburg '1:'部分) –

+2

根據您的描述(「表示每條線代表多少個觀察值的wgt)來判斷,您應該使用替換進行採樣。如果一條線的重量爲百分之十,則應該可以多次繪製。 – Frank

+1

我想這與data.table(它被標記)沒有任何關係。我不確定,但... – Frank

回答

3

我猜df是一個重複觀察(wgt是重複計數)的數據集的摘要描述。在這種情況下,從中取樣的唯一有用方法是替換;和適當的30%的樣品將是真正的人口的30%,.3*sum(wgt)

# example data 
wgt <- sample(10,2e6,replace=TRUE) 
nobs<- sum(wgt) 
pr <- wgt/sum(wgt) 

# select rows 
system.time(x <- sample.int(2e6,size=.3*nobs,prob=pr,replace=TRUE)) 
# user system elapsed 
# 0.20 0.02 0.22 

抽樣行,而不需要更換永遠在我的電腦上,而且是東西,我不認爲一個人需要在這裏做。

+1

+1;一個例子說明了爲什麼沒有替換的抽樣是錯誤的是一種情況,其中所有的權重都是0,除了一個(或者全部等於1,而其中一個是可笑的大)。 – eddi