簡體   English   中英

嵌套在r中的循環

[英]Nested for loops in r

我有2個數據框。

M看起來像這樣:

      vec_a vec_b vec_c
    A   0.0     0     0
    B   0.5     0     0
    C   0.5     1     1  

Rank看起來像這樣:

    rk_ini
    0.3333333
    0.3333333
    0.3333333

我想將M的第1行中的每個值乘以Rank第1行中的值,並將這些乘積相加。 然后對第2行和第3行執行相同的操作。

之后,我想將這3個值連接到一個向量中,然后將它們綁定到第二個數據幀Rank 應該使用新計算出的新值重復該操作,我剛剛計算出了另外3個值以綁定到Rank上,並在函數開始時指定的任何次數重復執行。 持續綁定到“排名”上的新列。

## iterate t times to get rank
for(i in 1:t) {
  for (j in 1:(nrow(M))) {
    nr1[j] <- sum((Rank[j, i] * M[j, 1]), 
                  (Rank[j, i] * M[j, 2]), 
                  (Rank[j, i] * M[j, 3]))

    nextrank <- c(nextrank, nr1[j])
  }
  Rank <- cbind(Rank, nextrank[i])
}

最后是結果:

      rk_ini     nextrank[i] nextrank[i] nextrank[i] nextrank[i] nextrank[i]
    A 0.3333333        0     0.1666667   0.8333333           0           0
    B 0.3333333        0     0.1666667   0.8333333           0           0
    C 0.3333333        0     0.1666667   0.8333333           0           0

結果應該看起來像這樣:

      rk_ini     nextrank[i] nextrank[i] nextrank[i] nextrank[i] nextrank[i]
    A 0.3333333       0          ....
    B 0.3333333   0.1666667      ....
    C 0.3333333   0.8333333      ....

新列中的每個連續行是前一列乘積的總和乘以M對應行中的每個值。

我已經嘗試了無數次嘗試,並且此最后一步不會產生任何錯誤,但是也不會產生我想要的結果。 您可以提供任何幫助以了解此處發生的情況,將不勝感激。

謝謝!

這是一種使用矩陣相乘%*%進行replicate的矢量化方法:

M <- as.matrix(M)
R <- as.matrix(R)
mm <- replicate(5,R <<- M%*%R,simplify = TRUE)

        [,1]      [,2]      [,3]      [,4]      [,5]
[1,] 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000
[2,] 0.1666666 0.0000000 0.0000000 0.0000000 0.0000000
[3,] 0.8333332 0.9999999 0.9999999 0.9999999 0.9999999

M和R在哪里;

M <- read.table(text='
vec_a vec_b vec_c
A 0.0   0    0
B 0.5   0    0
C 0.5   1    1',header=TRUE)
R <- read.table(text='
rk_ini
0.3333333
0.3333333
0.3333333',header=TRUE)

修改代碼,如下所示:

for(i in 1:t) {
            for (j in 1:(nrow(M))) {
            nr1[j] <- sum((Rank[j, i] * M[j, 1]), (Rank[j, i] * M[j, 2]), (Rank[j, i] * M[j, 3]))

            nextrank <- c(nextrank, nr1[j])
            }

            Rank <- cbind(Rank, nextrank[i*(1:3)])    **key step**
    }                

    Rank      
    }

嘗試:

> M
  vec_a vec_b vec_c
A   0.0     0     0
B   0.5     0     0
C   0.5     1     1
> 
> rank
       rank
1 0.3333333
2 0.3333333
3 0.3333333
> 
> for(i in 1:4){
+ M$rank = rank[,length(rank)]
+ M$new = apply(M, 1, function(x) x[4]*sum(x[1],x[2],x[3]) )
+ rank[,length(rank)+1] = M$new 
+ }

> M = M[c(1:3)]
> M
  vec_a vec_b vec_c
A   0.0     0     0
B   0.5     0     0
C   0.5     1     1

> print(rank)
       rank        V2         V3         V4          V5
1 0.3333333 0.0000000 0.00000000 0.00000000  0.00000000
2 0.3333333 0.1666666 0.08333332 0.04166666  0.02083333
3 0.3333333 0.8333333 2.08333313 5.20833281 13.02083203
> 

如果我理解正確,那么請參考您帖子中的數據,您希望新的Rank向量的第一個元素是Rank的第一個元素與A行的元素的sum(M[1, ] * R[1])sum(M[1, ] * R[1]) ),第二個元素為Rank的第二個元素與B行的元素之和( sum(M[2, ] * R[2]) )的和,依此類推。 然后,您想用新的Rank向量代替原始Rank向量來重復此計算。

如果真是這樣,那么我相信@rnso提供的解決方案的輸出是准確的。

這是一種矢量化方法,利用行i的第n個運算等效於Rank[i] * rowSums(M)[i]^n的事實,實現了相同的效果。

M <- matrix(c(0, 0, 0,
              0.5, 0, 0,
              0.5, 1, 1), ncol=3, byrow=TRUE)

R.init <- c(0.3333333, 0.3333333, 0.3333333)

n <- 5
t(mapply(function(m, r)  r * m^(seq_len(n)), rowSums(M), R.init))

#           [,1]       [,2]       [,3]        [,4]        [,5]
# [1,] 0.0000000 0.00000000 0.00000000  0.00000000  0.00000000
# [2,] 0.1666666 0.08333332 0.04166666  0.02083333  0.01041667
# [3,] 0.8333333 2.08333312 5.20833281 13.02083203 32.55208008

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM