所以我有一个表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)
答案 0 :(得分:3)
我会避免使用for
或while
循环,而是执行以下操作:
> 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