我想创建一个非常大的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会卡住。
有更快/更有效的方法吗?
谢谢!
答案 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
在没有替换的情况下对行进行采样需要永久保存在我的计算机上,但这也是我认为不需要做的事情。