【问题标题】:Random Sample with Replacement Loop带有替换循环的随机样本
【发布时间】:2014-07-28 17:43:16
【问题描述】:

我有一个 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”是为分组目的而创建的,对我的整体问题(发布在下面)几乎没有影响。

不是重复此代码五十次,而是让我获得五十个单独的样本(大小为 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

【问题讨论】:

  • @beginneR,对不起,我试图提供一些有用的东西供您用作示例集。例如,我想要使用此数据集的 10,000 个随机样本(每个样本大小为 5)。唯一感兴趣的变量是美元,不要注意“Num”。这有帮助吗?

标签: r statistics sample random-sample


【解决方案1】:

一个非常简单的方法是使用 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.callrbind 列表元素一起使用:

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

【讨论】:

  • 还有一件事。当我不包含以下代码 lst[[i]]["Sample"] &lt;- i 时,该脚本工作正常,但我确实需要这段代码。有什么建议吗?
  • 包含它时会发生什么?什么错误信息?
  • 这是我收到的错误“[.data.table(x, i, which = TRUE) 中的错误:当 i 是 data.table(或字符向量)时,x 必须是键控(即排序, 并且,标记为已排序),因此 data.table 知道要加入哪些列并利用 x 进行排序。首先调用 setkey(x,...),请参阅 ?setkey。"
  • 那么,您使用data.table 而不是data.frame 有什么原因吗? (请注意,在您的问题中,您写道您创建了一个 data.frame,但实际上创建了一个 data.table)。不幸的是,我不是 data.table 专家..
  • 我已经准备好了。感谢 agin 所做的一切。
【解决方案2】:

值得注意的是,如果您使用替换进行抽样,则抽取 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)]

【讨论】:

  • 非常感谢您的意见。该代码效果很好,并且非常概念化。 'Sample' 变量也出现在我的最终输出中。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-09-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-04-10
  • 2017-09-18
  • 2018-01-14
相关资源
最近更新 更多