【问题标题】:Sample without replacement, or duplicates, in R在 R 中没有替换或重复的样本
【发布时间】:2015-07-18 16:09:46
【问题描述】:

我有一个很长的列表,其中包含很多重复项,例如 100,000 个值,其中 20% 是重复项。我想从这个列表中随机抽样,将所有值分组,比如 400 个。但是,我不希望任何后续组在其中包含重复值 - 即,我希望每个组的所有 250 个成员都是唯一的。

我尝试过使用 vegan、picante、EcoSimR 的各种排列方法,但它们并没有完全达到我想要的效果,或者似乎难以处理大量数据。

我想知道是否有一些我不知道的示例函数的使用方法?任何帮助或替代建议将不胜感激......

【问题讨论】:

  • 您是否需要样本在组之间是唯一的(即我对 250 条记录进行采样,然后再对 250 条记录进行采样,依此类推 - 但对于所有样本中的所有组,只显示给定的记录一次)?
  • unique 函数浮现在脑海中......
  • 即使您希望每个值只出现一次,您是否希望被采样的概率与它在原始数据中出现的次数成正比?如果是这样,您可以创建一个仅包含唯一值的向量,但使用 sample 函数的 prob 参数设置与每个值在原始列表中出现的次数成比例的采样概率。
  • 不,我很高兴样本可以在组之间复制,而不是在组内复制。
  • 理想情况下,我希望将所有 100,000 个值同时定义到一个组(400 个组,每组 125 个)。因此,每个组将有 125 个唯一样本,但样本可以在组之间重复。

标签: r permutation random-sample


【解决方案1】:

正如nico 所述,您可能只需要使用unique 函数。下面是一个非常简单的抽样程序,可确保各组之间不会出现重复(这并不完全明智,因为您可以只创建一个大样本...)

# Getting some random values to use here
set.seed(seed = 14412)
thevalues <- sample(x = 1:100,size = 1000,replace = TRUE)

# Obtaining the unique vector of those values
thevalues.unique <- unique(thevalues)

# Create a sample without replacement (i.e. take the ball out and don't put it back in)
sample1 <- sample(x = thevalues.unique,size = 10,replace = FALSE)

# Remove the sampled items from the vector of values
thevalues.unique <- thevalues.unique[!(thevalues.unique %in% sample1)]

# Another sample, and another removal
sample2 <- sample(x = thevalues.unique,size = 10,replace = FALSE)
thevalues.unique <- thevalues.unique[!(thevalues.unique %in% sample2)]

要做eipi10 提到的事情并得到一个加权分布,你只需要先得到分布的频率。一种方法:

set.seed(seed = 14412)
thevalues <- sample(x = 1:100,size = 1000,replace = TRUE,prob = c(rep(0.01,100)))

thevalues.unique <- unique(thevalues)
thevalues.unique <- thevalues.unique[order(thevalues.unique)]
thevalues.probs <- table(thevalues)/length(thevalues)
sample1 <- sample(x = thevalues.unique,
                  size = 10,
                  replace = FALSE,
                  prob = thevalues.probs)

【讨论】:

  • 然后replicate 在最后一个命令中获取 400 个此类样本。
  • 感谢 TARehman,这很有帮助。我可能最终会这样做。但是,我真的希望一次分配所有组。更重要的是,这似乎阻止了样本在组之间以及在组内重复。我实际上希望将所有样本分配给一个组,所以很高兴在组之间有重复。抱歉,我的问题并不清楚。
  • 另外,第二段代码中的 order() 函数是做什么的?需要吗?谢谢
  • 我补充说,thevalues.unique 的排序顺序与table(thevalues) 中的结果相同,因此用于prob 的派生频率向量是正确的。我不知道它是否需要,但它似乎是谨慎的。至于同时采样,如果您不担心复制lapply()sample() 可能会起作用。如果你愿意,我会以某种方式进行编辑。
  • 感谢您的提议,但我想我已经做到了。虽然仍然不太了解 order() - 当我使用它时,它似乎会产生一个完全不相关的数字向量,而不仅仅是对它们进行排序。也许 sort() 会起作用
猜你喜欢
  • 1970-01-01
  • 2023-04-10
  • 1970-01-01
  • 2018-07-06
  • 2017-09-18
  • 2017-01-02
  • 1970-01-01
  • 2019-10-11
  • 1970-01-01
相关资源
最近更新 更多