R

时间:2015-07-20 17:11:07

标签: r random-sample

我想创建一个非常大的data.table df的随机子集(大约200万行)。 数据表有一个权重列wgt,表示每行代表的观察次数。 要生成我想要提取的行号矢量,我按以下步骤操作:

我得到了确切的观察数量:

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,]对数据进行子集化。但是,在计算ssout时R会卡住。

有更快/更有效的方法吗?

谢谢!

1 个答案:

答案 0 :(得分: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

在没有替换的情况下对行进行采样需要永久保存在我的计算机上,但这也是我认为不需要做的事情。