用于空容器中的循环输出:错误消息&不会重复

时间:2013-08-06 14:06:33

标签: r if-statement for-loop

我试图以各种方式处理这个循环,没有我遇到的网站帮助我解决了我的问题。我对R比较陌生,可以在我的代码出错的地方使用一些指导。我正在尝试运行一个for循环来重复这个序列1000次:创建两个随机的数字组“lakea”和“lakeb”,在两个湖泊上运行t检验,并存储该t的结果p值 - 空容器中的测试(显着或不显着)(结果)。我觉得我很接近,但由于某种原因无法重复这个过程。

result<-vector("list",1000)   #empty container to fill
for(i in 1:1000){
lakea<-rnorm(30,100,15)
lakeb<-rnorm(30,110,15)
    pval<-t.test(lakea,lakeb)$p.value   #stores pvalues from the t-test
    if(pval[i] <= 0.05) result[[i]]<-"stat sig" else   #if statement to name output
    result[[i]]<-"not sig"
}
result

循环导致1个实际结果与我想要的结果(“stat sig”或“not sig”),然后在容器中产生999个NULL对象。

我也尝试将容器的代码更改为:

result<-vector("character",length(1000))
for(i in length(result)){
...

给出了类似的结果,但是创建了一个比第一个代码少的行的长向量(仍然只有第一个具有预期输出的对象)。 我也尝试将容器代码更改为:

result<-c(NULL,length(1000))
for(i in result){
...

给了我“stat sig”或“not sig”的第一个输出,但没有别的。 在此先感谢您的帮助!

2 个答案:

答案 0 :(得分:4)

您可以使用为此类重新采样而构建的循环结构将问题压缩为一行,并使用ifelse对结果进行条件评估:

replicate( 1000 , ifelse( t.test( rnorm(30,100,15) ,  rnorm(30,100,15 ) )$p.value <= 0.05 , "stat.sig" , "not.sig" ) )

答案 1 :(得分:2)

这里有一些更简单的语法,可以避免必须初始化result向量:

myfun <- function(){
    lakea<-rnorm(30,100,15)
    lakeb<-rnorm(30,110,15)
    # OP's original code:
     #pval <- t.test(lakea,lakeb)$p.value   #stores pvalues from the t-test
     #if(pval <= 0.05)
     #    result <-"stat sig" else   #if statement to name output
     #result <- "not sig"
    # simplified version:
    result <- ifelse(pval <= 0.05, "sig", "not sig")
}
result <- replicate(1000,myfun())