簡體   English   中英

在r中優化嵌套for循環

[英]Optimize nested for loop in r

我有以下r代碼。 它嵌套了for循環。 如果i + 3行值為零,我想用NA替換數字。 它適用於小型數據集,但是,對於大型數據集,它會掛起。 我假設嵌套for循環不是實現它的有效方法。 有人可以幫助建議增強代碼,最好是tidyverse庫嗎?

x <- data.frame(c1=c(1,2,3,2,1,3),
                c2=c(4,5,6,2,3,4),
                c3=c(7,8,9,7,1,6),
                c4=c(4,0,9,1,5,0),
                c5=c(3,8,0,7,3,6),
                c6=c(2,8,5,0,5,7),
                row.names = c("r1","r2","r3","r4","r5","r6"))

for( i in 1:nrow(x)){
  for(j in 1:3){
    if (x[i, j+3] == 0){
      x[i, j] <- NA
    }
  }
}

輸出:x

   c1 c2 c3 c4 c5 c6
r1  1  4  7  4  3  2
r2 NA  5  8  0  8  8
r3  3 NA  9  9  0  5
r4  2  2 NA  1  7  0
r5  1  3  1  5  3  5
r6 NA  4  6  0  6  7

不需要循環遍歷行,您可以使用ifelse對外循環進行矢量化:

x[1:3] <- lapply(1:3, function(n) ifelse(x[[n+3]] == 0, NA, x[[n]]))
x
#   c1 c2 c3 c4 c5 c6
#r1  1  4  7  4  3  2
#r2 NA  5  8  0  8  8
#r3  3 NA  9  9  0  5
#r4  2  2 NA  1  7  0
#r5  1  3  1  5  3  5
#r6 NA  4  6  0  6  7

或者更簡單的方法,您可以通過執行布爾索引和賦值來基於最后三列修改前三列:

x[1:3][x[4:6] == 0] <- NA
x
#   c1 c2 c3 c4 c5 c6
#r1  1  4  7  4  3  2
#r2 NA  5  8  0  8  8
#r3  3 NA  9  9  0  5
#r4  2  2 NA  1  7  0
#r5  1  3  1  5  3  5
#r6 NA  4  6  0  6  7

暫無
暫無

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

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