随着 R 中样本量的增加,多次使用 sample() 而不进行替换

Use sample() without replacement multiple times with increasing sample size in R

我想从一个名为 data 的向量中提取 "random" 个样本,但增加 size 且没有替换。

为了说明我的观点 data 看起来像这样的例子:

data<-c("a","s","d","f","g","h","j","k","l","x","c","v","b","n","m")

我需要的是通过增加采样大小(从 size=2 开始)获得不同的采样向量,例如增加 2 但不同向量之间没有重复并将所有内容存储到列表中,这样结果看起来像这个:

sample_1<-c("s","d")
sample_2<-c("s","d","a","f")
sample_3<-c("s","d","a","f","m","n")
sample_4<-c("s","d","a","f","m","n","l","c")
sample_5<-c("s","d","a","f","m","n","l","c","j","x")
sample_6<-c("s","d","a","f","m","n","l","c","j","x","v","k")
sample_7<-c("s","d","a","f","m","n","l","c","j","x","v","k","g","b")
sample_8<-c("s","d","a","f","m","n","l","c","j","x","v","k","g","b","h")
samples<-list(sample_1,sample_2,sample_3,sample_4,sample_5,sample_6,sample_7,sample_8)

我目前拥有的是:

samples<-sapply(seq(from=2, to=length(data), by=2), function(i) sample(data,size=i,replace=F),simplify=F,USE.NAMES=T )

增加样本量但保留前面步骤的样本并在最后一个列表元素中包含所有观察结果是行不通的。 这样的事情可能吗?

不知道我理解的对不对,也许你只需要打乱数据一次:

data = letters
data_random = sample(data)
sapply(seq(from=2, to=length(data), by=2),
       function (x) data_random[1:x],
       simplify = FALSE)

在你对其他答案发表评论后,我想我得到了你想要实现的目标,所以扩展我以前的代码我最终得到:

data<-c("a","s","d","f","g","h","j","k","l","x","c","v","b","n","m")
set.seed(123)
nbitems=length(data)/2+length(data)%%2
results=vector("list",nbitems)

results[[1]] <- sample(data,2) # get first sample
for (i in 2:nbitems) { # Loop for each result
  samplesavail <- data[!data %in% results[[i-1]]] # Reduce the samples available
  results[[i]] <- c(results[[i-1]], sample( samplesavail, min( length(samplesavail), 2) ) ) # concatenate a new sample, size depends on step and remaining samples available.
}

希望这符合您的预期用途:

> results
[[1]]
[1] "n" "f"

[[2]]
[1] "n" "f" "a" "g"

[[3]]
[1] "n" "f" "a" "g" "m" "v"

[[4]]
[1] "n" "f" "a" "g" "m" "v" "x" "l"

[[5]]
 [1] "n" "f" "a" "g" "m" "v" "x" "l" "b" "j"

[[6]]
 [1] "n" "f" "a" "g" "m" "v" "x" "l" "b" "j" "k" "h"

[[7]]
 [1] "n" "f" "a" "g" "m" "v" "x" "l" "b" "j" "k" "h" "d" "s"

[[8]]
 [1] "n" "f" "a" "g" "m" "v" "x" "l" "b" "j" "k" "h" "d" "s" "c"

以前的方法:

如果我很了解你(但不确定):

data<-c("a","s","d","f","g","h","j","k","l","x","c","v","b","n","m")
set.seed(123) # fix the seed for repro of answer, remove in real case
nbitems=length(data)/2+length(data)%%2 # Get how much entries we should have when stepping by 2
results=vector("list",nbitems) # preallocate the list (as we'll start by end)
results[[nbitems]] = sample(data,length(data)) # sample the datas
for (i in nbitems:2) {
  results[[i-1]] <- results[[i]][1:(length(results[[i]]) - 2)] # for each iteration, take down the 2 last entries.
}

这会给出一个条目作为第一个结果。

刚刚注意到这与@sbstn 的回答相同,但采用了更复杂的后向方法,发布以防它有一些价值。