嵌套的While-Loop - R.

时间:2014-02-23 22:31:31

标签: r while-loop nested-loops

所以我有一个表m,由随机数量的行和列组成。 (可以是任何尺寸)......

我想针对每个行/列总计进行此计算:

  r[i] * c[j] / n;

r <- rowSums(m);c <- colSums(m);n <- sum(m);

的位置

我可以使用双循环来实现它,但我希望现在使用while循环来实现它。

我不会使用while循环,但似乎表格大小可能不同,我认为它也是明智的。

我正在存储test向量中找到的每个值。

这是我的尝试,但我搞砸了指数:

while(i < nrow(m)){
    while(j < ncol(m)){
        test[i] <- r[i]*c[j] / n;
        j=j+1;
        i=i+1;
    }
    j=j+1;
    i=i+1;
}

任何帮助我理清我的循环的指导都会非常感激。提前谢谢。

更新

请参阅下面的示例和预期结果:

    m <- t(matrix(c(28,48,10,114), nrow=2, ncol=2));
    r <- rowSums(m); #76 124 (sum of rows)
    c <- colSums(m); #38 162 (sum of cols)
    n <- sum(m);     #200 (sum of all cells)

    test <- c(0, times length(m)); #empty vector/data frame

    #inside while loops, calc for each r and c indice:
    test[1] <- 76 *38 /200 #first calc to test[i] where i=1
    test[2] <- 124*38 /200
    test[3] <- 76*162 /200
    test[4] <- 124*162/200 #last calc to test[i] where i==length(m)

3 个答案:

答案 0 :(得分:3)

我会避免使用forwhile循环,而是执行以下操作:

> as.vector(outer(r,c, function(x,y) x*y/n))
[1]  14.44  23.56  61.56 100.44

答案 1 :(得分:2)

无需使用while循环。最好在R(和任何其他基于数组的语言)中使用向量运算。它使代码更清晰,更快捷。

nrows<-sample(1:100,1) # a random number of rows
ncols<-sample(1:100,1) # a random number of columns

#create a matrix of random numbers with our random dimnesions
m<-matrix(runif(nrows*ncols), nrow=nrows) 
n<-sum(m)
#read into outer, it creates a cartesian product of your vectors
#so you will have every r[i] multipled with every r[j]...ie what your loop is doing
r<-outer(rowSums(m),colSums(m),function(x,y) x*y/n)

希望这有帮助,如果您有任何问题,请与我联系。

答案 2 :(得分:1)

更像R的解决方案是使用expand.grid而不是嵌套的while循环:

设置:

> m <- matrix(1:12, 3, 4)
> m
     [,1] [,2] [,3] [,4]
[1,]    1    4    7   10
[2,]    2    5    8   11
[3,]    3    6    9   12
> n <- sum(m)
> r <- rowSums(m)
> c <- colSums(m)

现在:

> test <- expand.grid(r,c)
> test
   Var1 Var2
1    22    6
2    26    6
3    30    6
4    22   15
5    26   15
6    30   15
7    22   24
8    26   24
9    30   24
10   22   33
11   26   33
12   30   33
> test <- test[,1] * test[,2] / n
> test
 [1]  1.692308  2.000000  2.307692  4.230769  5.000000  5.769231  6.769231
 [8]  8.000000  9.230769  9.307692 11.000000 12.692308