我正在尝试运行将结果存储在向量中的循环。但是我还需要在预定向量上增加计数器,以使存储的计算正常运行。我被困在两部分上:(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参数。
有人可以帮忙吗?
答案 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