2014-02-23 246 views
1

所以我有一個表m,由隨機數的行和列組成。 (可以是任意大小)...嵌套的while循環 - R

我想這樣做對各行/列總計這樣計算:

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

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

我可以用雙做for循環,但我希望現在使用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) 
+0

也許,'outer'在這裏可能很有用。像'outer(r,c,function(x,y)x * y/n)' –

+0

可以用預期的輸入/輸出添加一個實際的例子嗎?由於R是矢量化的,只要運行'r * c/n'就會將行總和與相應的列和相加,然後除以總和......當你說三行十列時你想要發生什麼還不清楚...數據如何回收? – Chase

+0

我已經添加了一個例子。我希望這可以讓我更清楚自己想要達到的目標。感謝發佈。 PS。所有行總數(無論是3還是500)都需要按照列總數(無論是3還是500)進行計算。 – Reanimation

回答

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) 

希望這可以幫助,讓我知道如果您有任何問題。

+0

另一個很好的答案。很好的實施。謝謝你的解釋。 – Reanimation

3

我會避免使用forwhile循環,做這樣的事情,而不是:

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

啊優秀。這是我見過的第一個外部函數。非常便利。感謝發佈。 – Reanimation

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 
+0

噢,很好:D另一個很好的答案。感謝發佈。 – Reanimation