【问题标题】:Randomly sample from a dataset then delete sampled entries (R)从数据集中随机采样,然后删除采样条目 (R)
【发布时间】:2015-10-02 03:21:04
【问题描述】:

我有来自存储在向量中的正态分布的 600 个元素的随机样本:

sample_data <- rnorm(600, mean =10, sd = 6)

我正在尝试将此向量分成 100 个随机组,每组 6 个条目。
使用示例函数执行此操作是一个简单的命题:

group_1 <- sample(6, sample_data, replace=FALSE)   

但是,如果我再次使用示例函数,则有可能会重新使用某些条目,因为它们没有从初始数据中删除。一种可能的解决方案可能是最初将数据存储在 100x6 矩阵中,并将每一行视为一个“随机组”。

但是,我很好奇是否有一种更有效的方法可以从数据集中获取连续样本,同时确保不会对任何条目进行多次采样。
谢谢!

【问题讨论】:

  • @Pascal - matrix(sample(sample_data), 6, 100) 也会打乱这些案例。
  • 理论上是的,只是因为初始样本是随机生成的。但为了论证的缘故,假设样本不是随机的。你怎么能把它分成 100 个随机组,每组 6 个?
  • matrix(sample_data[sample(1:600, 600)], 6, 100)
  • @jeremycg - 不需要索引。例如sample(1:10) 只会打乱而不替换原来的1:10

标签: r random


【解决方案1】:

g 是一个向量,将每个索引 1..600 分配给一个组 1..100。我们将从

g0 = rep(1:100, each=6)
# [1]   1   1   1   1   1   1   2   2   2 ...

然后打乱它

set.seed(1)
g = sample(g0)
#   [1]  27  38  58  91  21  90  94  66  ...

现在,如果您想拆分原始向量,请使用split

split(sample_data, g)
# $`1`
# [1] 18.528965  7.463326  7.585449  5.701404  2.017379 10.866809
# 
# $`2`
# [1]  6.338364 22.112578  5.370649  9.952592 10.618581  1.168506
# ...

正如几位评论者所指出的,将其存储在矩阵中是有意义的。使用起来会更快、更全面:

sample_mat <- matrix(sample_data[order(g)], 100, 6, byrow=TRUE)
#           [,1]      [,2]     [,3]     [,4]      [,5]      [,6]
# [1,] 18.528965  7.463326 7.585449 5.701404  2.017379 10.866809
# [2,]  6.338364 22.112578 5.370649 9.952592 10.618581  1.168506
# ...

我喜欢构建这样一个向量 g 来跟踪事物,但正如 @thelatemail 在第一个 cmets 中指出的那样,您可以简单地执行 sample_mat &lt;- matrix(sample(sample_data), 6, 100),分配给组并将结果放入一步完成一个矩阵。

【讨论】:

    猜你喜欢
    • 2019-10-02
    • 1970-01-01
    • 2021-08-20
    • 1970-01-01
    • 2012-08-09
    • 1970-01-01
    • 2017-06-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多