带替换环的随机样本

时间:2014-07-28 17:43:17

标签: r statistics sample random-sample

我有一个R脚本,允许我选择一个样本大小,并采取替换50个单独的随机样本。以下是此代码的示例:

## Creates data frame
df = as.data.table(data)

## Select sample size
sample.size = 5

## Creates Sample 1 (Size 5)

    Sample.1<-df[, 
     Dollars[sample(.N, size=sample.size, replace=TRUE)], by = Num]
    Sample.1$Sample <- c("01")

根据上面的R脚本,我首先创建了一个数据框。然后我选择我的样本大小,在这种情况下是5.这只代表一个样本。由于我缺乏R的经验,我再重复这段代码49次。最后一段代码如下所示:

## Creates Sample 50 (Size 5)

   Sample.50<-df[, 
     Dollars[sample(.N, size=sample.size, replace=TRUE)], by = Num]
   Sample.50$Sample <- c("50")

样本输出看起来像这样(样本范围1 - 50):

Num  Dollars   Sample
  1    85000       01
  1     4900       01
  1    18000       01
  1     6900       01
  1    11000       01
  1     8800       50
  1     3800       50
  1    10400       50
  1     2200       50
  1    29000       50

应该注意的是,可变的“Num&#39;是为了分组而创建的,对我的整体问题几乎没有影响(发布在下面)。

不是重复这个代码五十次,为了得到五十个单独的样本(大小为5),我可以创建一个循环来帮助我限制代码吗?我最近被要求创建一万个随机样本,每个样本大小为5.我显然不能重复这个代码一万次,所以我需要某种循环。

我的最终输出样本应该如下所示(样本范围1 - 10,000):

Num  Dollars   Sample
  1    85000       01
  1     4900       01
  1    18000       01
  1     6900       01
  1    11000       01
  1     9900    10000
  1     8300    10000
  1    10700    10000
  1     6800    10000
  1    31000    10000

提前感谢大家的帮助,非常感谢。

如果需要,可以使用以下示例代码:

Num Dollars
1   31002
1   13728
1   23526
1   80068
1   86244
1   9330
1   27169
1   13694
1   4781
1   9742
1   20060
1   35230
1   15546
1   7618
1   21604
1   8738
1   5299
1   12081
1   7652
1   16779

2 个答案:

答案 0 :(得分:2)

一个非常简单的方法是使用for循环并将结果存储在列表中:

lst <- list()

for(i in seq_len(3)){
  lst[[i]] <- df[sample(seq_len(nrow(df)), 5, replace = TRUE),]
  lst[[i]]["Sample"] <- i
}

> lst
[[1]]
     Num Dollars Sample
20     1   16779      1
1      1   31002      1
12     1   35230      1
14     1    7618      1
14.1   1    7618      1

[[2]]
     Num Dollars Sample
9      1    4781      2
13     1   15546      2
12     1   35230      2
17     1    5299      2
12.1   1   35230      2

[[3]]
   Num Dollars Sample
1    1   31002      3
7    1   27169      3
17   1    5299      3
5    1   86244      3
6    1    9330      3

然后,要创建单个data.frame,请同时使用do.call rbind列表元素:

do.call(rbind, lst)
     Num Dollars Sample
20     1   16779      1
1      1   31002      1
12     1   35230      1
14     1    7618      1
14.1   1    7618      1
9      1    4781      2
13     1   15546      2
121    1   35230      2
17     1    5299      2
12.1   1   35230      2
11     1   31002      3
7      1   27169      3
171    1    5299      3
5      1   86244      3
6      1    9330      3

答案 1 :(得分:1)

值得注意的是,如果您使用替换对进行采样,则绘制50(或10,000)个大小为5的样本相当于绘制一个大小为250的样本(或50,000)。因此,我会这样做(你会看到我从@ beginneR的答案中偷走了一行):

df = as.data.table(data)

## Select sample size
sample.size = 5
n.samples = 10000

# Sample and assign groups
draws <- df[sample(seq_len(nrow(df)), sample.size * n.samples, replace = TRUE), ]
draws[, Sample := rep(1:n.samples, each = sample.size)]