【问题标题】:If () statement or while () loop in RR 中的 if () 语句或 while () 循环
【发布时间】:2017-12-29 19:38:02
【问题描述】:
x=matrix(0)
test <- vector(mode="numeric", length=196)
for(i in 1:196){
    x=c[c(1:(200+i*50)),]
    ts=BiCopGofTest(x[,1], x[,2], 1, par =  0.6 ,method="white",max.df = 30, B = 0, obj = NULL)
    test[i]=ts$statistic}
plot(test, type='l')

我有一个矩阵 c,它有 10,000 行和 2 列。我取了矩阵 c 的前 200 行,并计算了测试的值。每次我将行数增加 50 并计算测试。上面的代码就是这么写的。

我现在想做的是以下。我想重复相同的过程,但是当测试大于 7.81 时,我想停止并返回数组 x。我想稍后使用该数组,因此存储它很重要。我应该使用 IF 语句还是 WHILE 循环?任何帮助将不胜感激。

【问题讨论】:

  • if (ts$statistic &gt; 7.81) break 应该做你想做的事。 break 告诉 R 退出 for 循环。您可以使用 while 循环进行类似的构造,这只是一个偏好问题。

标签: r loops if-statement while-loop


【解决方案1】:

注意这样做

x=c[c(1:(200+i*50)),]

在您的循环中,您正在覆盖 x,并且您丢失了原始矩阵。此外,您的子集陈述并不真正正确。您应该创建一个新变量来保存循环中的行子集。你可能会这样做:

x=matrix(runif(10000*2,0,1),10000,2)
test <- vector(mode="numeric", length=196)

i=0

while(max(test)<7.81 & 200+i*50<=nrow(x)  )
{
     y = x[seq(1,200+i*50),] # y contains the first 200+i*50 rows of x
     ts= runif(1,1,7.9) # random test statistic, enter yours here.
     test[i]= sum(ts)
     i=i+1
}
plot(test, type='l')

这将继续你的循环,直到:

  • x 中没有更多行
  • 检验统计量大于 7.81

请注意,我没有包含 BiCopGofTest 的包,所以我只是使用 runif 作为我的测试统计;)

希望这会有所帮助!

【讨论】:

  • 我对你写的内容有疑问。您执行此步骤 x=matrix(runif(10000*2,0,1),10000,2) 只是因为您想创建一个包含 10000 行和 2 列的数组 x?我应该用我的数组 c 替换 x 吗?
  • 是的,我刚刚创建了一些随机样本数据来测试我的脚本。请注意,c 并不是一个很好的变量名称,因为 c 也用于构造向量。
  • 我刚刚注意到我在提出问题时犯了一个错误。我的原始数组是具有 10,000 行和 2 列的 c。然后我创建了矩阵 x 以便如上所述访问 c 的不同元素。
  • 我对 while 语句有疑问,即 while(max(test)
  • 当他们俩都是TRUE时,它将继续,我在我的答案中添加了“要么”这个词来澄清。如果其中一个不再是TRUE(即您已经遍历了所有行,或者找到了足够高的测试统计信息),则循环将停止。因为TRUE &amp; FALSE 返回FALSE。因此,while 条件不再成立,while 循环将停止。如果使用 OR,它将继续循环,直到它们都为 FALSE,因为 TRUE | FALSE 返回 FALSE。我希望这是一个明确的解释。如果您觉得我的回答对您有帮助,您能接受或点赞吗?谢谢!
猜你喜欢
  • 2015-05-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-06-09
  • 2014-01-21
  • 2015-11-08
  • 2016-01-12
  • 2013-11-01
相关资源
最近更新 更多