【问题标题】:Nested While-Loop - R嵌套的 While 循环 - R
【发布时间】:2014-03-25 09:30:05
【问题描述】:

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

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

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

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

我可以使用双 for 循环来实现,但我希望现在使用 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)

【问题讨论】:

  • 也许,outer 在这里有用。类似outer(r, c, function(x, y) x * y / n)
  • 您能否添加一个具有预期输入/输出的实际示例?由于 R 是矢量化的,只需运行 r * c / n 即可将行总和与相应的列总和相匹配,然后除以总和......当你说三行十列时,不清楚你想要发生什么......如何数据应该被回收吗?
  • 我添加了一个示例。我希望这能让我更清楚我想要实现的目标。感谢您发布。附言。所有行总数(无论是 3 还是 500)都需要使用曾经的列总数(无论是 3 还是 500)来计算。

标签: r while-loop nested-loops


【解决方案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

【讨论】:

    【解决方案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)
    

    希望对您有所帮助,如果您有任何问题,请告诉我。

    【讨论】:

    • 另一个很好的答案。很好的实施。也谢谢你的解释。
    【解决方案3】:

    我会避免使用forwhile 循环,而是做这样的事情:

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

    【讨论】:

    • 啊,太好了。这是我第一次看到外部函数。非常便利。感谢发帖。
    猜你喜欢
    • 2023-03-02
    • 2017-04-30
    • 2015-01-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多