【问题标题】:sample() command is too slow in RR 中的 sample() 命令太慢
【发布时间】: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


【解决方案1】:

我猜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;一个说明为什么不进行替换的抽样是错误的示例是这样一种情况,即所有权重都为 0,除了一个(或所有都等于 1,而一个大得离谱)。
猜你喜欢
  • 1970-01-01
  • 2021-11-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-02-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多