在R中创建一个'for'循环

时间:2013-05-09 04:34:31

标签: r

我有一点R情况,我无法理解。

据说这个代码只需要两行或三行

我要做的是弄清楚在看到每个数字之前我必须采取的10个变量样本。

换句话说,在我看到每一面之前需要多少卷骰子(在这种情况下有10面)

到目前为止,我还有这些方面的内容

    param<-1:10
    count<-0
    seen<-0
    for (i in 1:10) {
      if (sample(param, size=1)==i);
        if i in seen;
          count+=1
          seen+=1
        elif count+=1
    when seen==10 return(count) 
    }

但是这太长了,我也知道它的格式不正确(很确定我试图在某些时候使用python代码)但这是我第一次在R中做了一个循环。

非常感谢任何帮助!

是的,这是一个项目,但我想不出别的。 是的,我已经尝试过寻找其他问题/答案以寻求帮助,但我的大脑现在只是陷入困境

2 个答案:

答案 0 :(得分:3)

如果您正在寻找更短的代码:

set.seed(1984)

n = 10
param = 1:n
count = 0

while(length(param) != 0){             ## stop when all numbers are seen
 param = setdiff(param, sample(1:n,1)) ## remove the element
 count = count + 1
}

count

## 28

修改(略有矢量化的方法)

set.seed(1984)

n = 10
param = 1:n
count = 0

while(length(param) != 0){
  count = count + length(param)
  param = setdiff(param, sample(1:n,length(param),replace=T))
}

count

## 28

编辑2(多次运行)

set.seed(1984)

n = 10
num.runs = 5
count = rep(0,5)

for(i in 1:num.runs)
{
  param = 1:n
  while(length(param) != 0){
    count[i] = count[i] + length(param)
    param = setdiff(param, sample(1:n,length(param),replace=T))
  }
}

count

## 28 24 23 30 23

答案 1 :(得分:3)

您可以通过故意过采样来解决此问题。在这个例子中,我创建了一个长度为1000的采样向量,然后使用sapply来找到解决方案:

已修改,使用match而不是sapply,正如@MadScone所建议

set.seed(1984)
n <- 10

x <- sample(n, 1e3, replace=TRUE)
max(match(1:n, x))
[1] 28

如果您想重复体验,可以使用replicate

do_experiment = function() {
    n <- 10
    x <- sample(n, 1e3, replace=TRUE)
    return(max(match(1:n, x)))
}
replicate(100, do_experiment())
 [1] 28 26 26 15 30 14 29 18 35 24 24 35 42 20 29 18 18 38 14 22 26 26 22 29 31
 [26] 51 14 35 26 19 40 22 23 19 28 15 27 20 16 18 20 19 18 37 24 38 37 54 29 19
 [51] 22 22 14 17 33 22 35 15 32 23 35 27 22 18 30 31 38 36 26 31 43 27 23 21 40
 [76] 25 36 21 39 27 55 28 36 15 48 31 32 46 28 21 40 23 46 24 31 30 25 21 24 20
相关问题