在R中进行无重复抽样或不重复抽样

5
我有一个包含很多重复值的长列表,比如100,000个值,其中20%是重复的。我想要从这个列表中随机抽样,并将所有值分成一些组,比如每组400个。但是,我不想让任何一个后续的组内包含重复的值——也就是说,我希望每个组的250个成员都是唯一的。
我尝试使用了来自vegan、picante和EcoSimR的各种排列方法,但它们并不能完全满足我的需求,或者在处理大量数据时会出现问题。
我想知道是否有一些我无法想到的使用sample函数的方法?非常感谢您提供任何帮助或替代建议...

2
您需要样本在各个组之间是唯一的吗?例如,我抽取了250条记录,然后再抽取250条记录,以此类推-但是对于所有样本中的所有组,给定的记录仅出现一次。 - TARehman
2
“unique”函数让人想起…… - nico
2
即使您希望每个值仅出现一次,但是否希望被抽样的概率与其在原始数据中出现的次数成比例?如果是这样,您可以创建一个仅包含唯一值的向量,但使用“sample”函数的“prob”参数设置采样概率,这些概率与每个值在原始列表中出现的次数成比例。 - eipi10
不,我希望样本在组之间重复,但不希望在同一组内重复。 - rw2
理想情况下,我希望所有的100,000个值可以同时被定义为一个组(即400组,每组125个)。因此,每个组将有125个独特的样本,但是样本可以在组之间重复。 - rw2
作为回应 eipi10 的问题,是的,我想让它成比例。如果所有样本同时被分配到一组中,那么希望它会自动发生。谢谢。 - rw2
1个回答

9
正如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)

1
然后对最后一个命令进行“复制”操作,以获得400个这样的样本。 - Frank
谢谢TARehman,这非常有帮助。我可能最终会像这样做。然而,我真的希望能一次性分配所有组。更重要的是,这似乎可以防止在组内和组间重复使用样本。实际上,我希望将所有样本都分配到一个组中,所以我很高兴在组之间有重复。抱歉我的问题没有表述清楚。 - rw2
另外,在第二段代码中,order()函数是做什么的?它是否必要?谢谢。 - rw2
我添加了这个,以便thevalues.unique按照table(thevalues)中的结果排序,这样用于prob的派生频率向量就是正确的。我不知道是否需要,但这似乎是明智的选择。至于同时抽样,如果您不担心复制,lapply()sample()可能会起作用。如果您想要,我可以编辑一下来实现这个功能。 - TARehman
谢谢提供帮助,但我想我已经解决了。不过,我仍然不太理解order()函数——当我使用它时,似乎会产生完全无关的数字向量,而不仅仅是对它们进行排序。也许可以尝试使用sort()函数。 - rw2
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接