[英]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.