在R中的While循环外创建表

时间:2018-10-18 11:03:11

标签: r loops while-loop

我正在尝试从while循环中制作一张桌子。基本上,我想做一个while循环,其中r的值增加1并重复该过程直到不等式得到满足。但是除此之外,我想将这些值组合到一个包含三列的表中:r的值,w的值和rhs的值(四舍五入到小数点后三位)。

```{r}
al = 0.10; n = 30; a = 3; b = 5; r = 2; int = 8; h = (int/2); msE = 19.19
table = function(MSE, V, H, alpha = al, r = 2){
  rhs = h^2*r/((V-1)*MSE)
  w = qf(alpha, V-1, V*(r-1), lower.tail = FALSE)
  g = data.frame(r, round(w, 3), round(rhs, 3))
  while(w > rhs){
    r = r+1
    rhs = h^2*r/((V-1)*MSE)
    w = qf(alpha, V-1, V*(r-1), lower.tail = FALSE)
    g = data.frame(r, round(w, 3), round(rhs, 3))
  }
  rbind(g)
}
table(MSE = msE, V = a*b, H = h)
```

我认为它会像这样,但是这只会在循环结束之前打印出r的最后一个值(结束于26),这会导致一个只有一行的“表”。我想要一张有24行的表(因为它从r = 2开始)。

任何帮助将不胜感激!

2 个答案:

答案 0 :(得分:2)

也许这可能有所帮助:

al = 0.10; n = 30; a = 3; b = 5; r = 2; int = 8; h = (int/2); msE = 19.19
table = function(MSE, V, H, alpha = al, r = 2){
  rhs = h^2*r/((V-1)*MSE)
  w = qf(alpha, V-1, V*(r-1), lower.tail = FALSE)
  g = data.frame(r, round(w, 3), round(rhs, 3))
  gn = data.frame(r, round(w, 3), round(rhs, 3))
  while(w > rhs){
    r = r+1
    rhs = h^2*r/((V-1)*MSE)
    w = qf(alpha, V-1, V*(r-1), lower.tail = FALSE)
    g = data.frame(r, round(w, 3), round(rhs, 3))
    gn <- rbind(gn,g)
  }
return(gn)
}
table(MSE = msE, V = a*b, H = h)

答案 1 :(得分:0)

稍有不同的方法,不需要临时数据帧和rbind()。在代码中注释。

# your parameters
al <- 0.10; n <- 30; a <- 3; b <- 5; int <- 8; h <- (int/2); msE <- 19.19

# your function definition (name changed to avoid confusion / conflict with existing R function)
tabula <- function(MSE, V, H, alpha = al, r = 2)
{
    g <- data.frame( N = 0, W = 1, RHS = 0 )        # initiate data frame, values set
                                                    # so that the while condition is met

    # the while function populates the data frame cell by cell,
    # eliminating the need for an interim data.frame and rbind()
    while( g[ r - 1, "W" ] > g[ r - 1, "RHS" ] )    # check condition in the last data frame row
    {                                               # write values in a new row
        g[ r, "N" ] <- r
        g[ r, "W" ] <- round( qf( alpha, V - 1, V * ( r - 1 ), lower.tail = FALSE ), 3 )
        g[ r, "RHS" ] <- round( h^2 * r / ( ( V - 1 ) * MSE ), 3 )
        r <- r + 1                                  # increment row counter
    }
    return( g[ -1, ] )                              # return the data frame, removing the initial row
}

tabula( MSE = msE, V = a * b, H = h )