【发布时间】:2015-07-20 17:11:07
【问题描述】:
我想创建一个非常大的 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,] 对数据进行子集化。但是,R 在计算 ssout 时会卡住。
有没有更快/更有效的方法来做到这一点?
谢谢!
【问题讨论】:
-
如果您指定所有参数,使用
sample.int会稍微减少一点,这也将迫使您不首先创建1:ns向量(正如@DavidArenburg 通过跳过1:部分所建议的那样) -
根据您的描述(“表示每行代表多少观察的 wgt”)判断,您应该进行替换抽样。如果一条线有百分之十的粗细,你应该可以画多次。
-
我猜这与 data.table (它的标签)没有任何关系;不过我不确定……
-
如果您决定确实想要不更换样品,请参阅stackoverflow.com/questions/15113650/…(那里有一组惊人的答案!)
标签: r random-sample