R:将循环结果存储在向量中

时间:2020-09-16 16:47:47

标签: r loops for-loop vector indexing

我正在尝试运行将结果存储在向量中的循环。但是我还需要在预定向量上增加计数器,以使存储的计算正常运行。我被困在两部分上:(1)增加计数器,(2)将循环结果存储在向量中。

我是循环的新手,所以请忍受以下最可能的错误语法;这是我正在使用的东西:

x <- c(.01,.05,.10,.20,.25) # observed defect rates
for(i in x) {
  j <- 1
  if(x < 1){
    atmost2[] <- dbinom(0,size=10,prob=x[[j]])+
    dbinom(1,size=10,prob=x[[j]])+
    dbinom(2,size=10,prob=x[[j]]) &&
      j <- j + 1
  }
}
atmost2

基本上,我想将结果存储在一个新的向量atmost2中,每个后续循环通过增加j来遍历x中向量值。应该增加j来从x中的预定矢量值更改dbinom中的prob参数。

有人可以帮忙吗?

2 个答案:

答案 0 :(得分:2)

几件事:

juljo在循环之前初始化向量是正确的,并且他们进行了一些其他更正,但是我认为他们的代码仅在您已经建立的情况下有效:

j <- 1

否则,juljo的代码将中断。

此外,您的代码不需要'&&'即可工作。只需将j <-j + 1放在新行上,就像这样(使用jugo的代码)

j <- 1
x <- c(.01,.05,.10,.20,.25) # observed defect rates
atmost2 <- as.numeric(1:length(x))  # this initializes the vector to a predetermined length which may help with very large loops
for(i in 1:length(x)) {
  
  if(x < 1){
    atmost2[i] <- dbinom(0,size=10,prob=x[j])+   # note that the double brackets are gone
      dbinom(1,size=10,prob=x[j])+
      dbinom(2,size=10,prob=x[j]) 
  }
  j <- j + 1  # I think you want j to increment outside the if statement
}
atmost2

此代码可以执行某些操作,但是有一些警告,我不确定您要做什么。

您也可以跳过dbinoms的添加,而改为:

j <- 1
x <- c(.01,.05,.10,.20,.25) # observed defect rates
atmost2 <- as.numeric(1:length(x))  # this initializes the vector to a predetermined length which may help with very large loops
for(i in 1:length(x)) {
  
  if(x < 1){
    atmost2[i] <- sum(dbinom( 0:2 , size=10,prob=x[j]))  #dbinom will give a vector that can be summed
  }
  j <- j + 1  # I think you want j to increment outside the if statement
}
atmost2

但是我认为使用j迭代器可能是其他编程语言的习惯。注意使用循环但没有j:


x <- c(.01,.05,.10,.20,.25) # observed defect rates
atmost2 <- as.numeric(1:length(x))  # this initializes the vector to a predetermined length which may help with very large loops
for(i in 1:length(x)) {
  
  if(x < 1){
    atmost2[i] <- sum(dbinom(0:2,size=10,prob=x[i])) 
  }
  }
atmost2

这些都产生相同的输出:

> atmost2
[1] 0.9998862 0.9884964 0.9298092 0.6777995 0.5255928

但是我有后续问题:

最多2个长度应与x相同吗?

您是否将x中的值用作概率?因此,tomost2是基于x [i]的值的二项式概率之和?

一定要循环吗? R非常好地使用向量,因此apply函数可能会有所帮助。您可能会发现lapply在这里有用。 ?应用可能会让您开始时 ?lapply将提供其他apply函数的描述。

所以您的代码可能看起来像这样

x <- c(.01, .05, .10, .20, .25)
atmost2 <- as.numeric(1:length(x)) 

atmost2 <- lapply(x, function(x) sum(dbinom( 0:2 , size = 10, prob = x)))

atmost2   # this is a list, not a vector

lapply函数的内容如下:

应用于列表“ x”(一个函数)中的项目。

在这种情况下,该函数是匿名函数“ sum(dbinom ....)”

因此,对x的每个值应用sum(dbinom ...)函数并返回一个列表。

基本上,它为您执行循环。而且通常比for循环快(在R中)。

如果您最多需要2个不是列表而是一个向量,则可以:

unlist(atmost2)

>   unlist(atmost2)
[1] 0.9998862 0.9884964 0.9298092 0.6777995 0.5255928

根据Rui的提醒进行编辑

使用sapply,其他所有内容都相同,但是输出确实是向量。

x <- c(.01, .05, .10, .20, .25)
atmost2 <- as.numeric(1:length(x)) 

atmost2 <- sapply(x, function(x) sum(dbinom( 0:2 , size = 10, prob = x)))

atmost2   # this is a vector

答案 1 :(得分:0)

如何调用这样的元素:

x <- c(.01,.05,.10,.20,.25) # observed defect rates
atmost2 <- numeric() # Initialize vector before filling it in the loop
for(i in 1:length(x)) {
  if(x[i] < 1){
    atmost2[i] <- dbinom(0,size=10,prob=x[i])+
      dbinom(1,size=10,prob=x[i])+
      dbinom(2,size=10,prob=x[i])
  }
}
atmost2