簡體   English   中英

如何在 r 中將嵌套循環轉換為 lapply

[英]how to convert a nested loop to lapply in r

我有一個名為“daha​​k”的列表,其中包含 1 到 10 之間的 30000 個數字。我想用列表中的所有數字檢查每個數字,如果兩個數字相等,則將數字 1 附加到 weight_list,如果兩個數字不相等然后計算它們的差異並將其存儲為 x 並將 x 附加到 weight_list。 這是代碼:

for(j in 1:num_nodes){
  for (k in 1:num_nodes){
    if(j==k){
      weight_list <- c(weight_list,0)
    }
    else if(as.numeric(dahak[j])==as.numeric(dahak[k])){
      weight_list <- c(weight_list,1)
    }
    else if(as.numeric(dahak[j])!=as.numeric(dahak[k])){
      x = 1 - (abs(as.numeric(dahak[j]) - as.numeric(dahak[k])) / 10)
      weight_list <- c(weight_list,x)
    }
  }
}

如何優化此代碼? 我怎么能用 lapply 做到這一點?

聽起來您想創建一個 30,000 x 30,000 的矩陣。 這也聽起來像dahak是一個向量而不是一個列表。 如果這真的是您想要做的,您可以簡化您的邏輯並像這樣進行矢量化;

get_weights <- function(x)  1 - abs(x - as.numeric(dahak))/10 
weights <- do.call(rbind, lapply(as.numeric(dahak), get_weights)) - diag(length(dahak))

使用與@ThomasIsCoding 相同的虛擬數據,我得到:

weights
#>       [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10] [,11] [,12] [,13] [,14] [,15]
#>  [1,]  0.0  0.9  0.7  0.3  1.0  0.4  0.3  0.6  0.6   0.8   1.0   0.9   0.6   0.9   0.5
#>  [2,]  0.9  0.0  0.8  0.4  0.9  0.5  0.4  0.7  0.7   0.7   0.9   0.8   0.7   1.0   0.6
#>  [3,]  0.7  0.8  0.0  0.6  0.7  0.7  0.6  0.9  0.9   0.5   0.7   0.6   0.9   0.8   0.8
#>  [4,]  0.3  0.4  0.6  0.0  0.3  0.9  1.0  0.7  0.7   0.1   0.3   0.2   0.7   0.4   0.8
#>  [5,]  1.0  0.9  0.7  0.3  0.0  0.4  0.3  0.6  0.6   0.8   1.0   0.9   0.6   0.9   0.5
#>  [6,]  0.4  0.5  0.7  0.9  0.4  0.0  0.9  0.8  0.8   0.2   0.4   0.3   0.8   0.5   0.9
#>  [7,]  0.3  0.4  0.6  1.0  0.3  0.9  0.0  0.7  0.7   0.1   0.3   0.2   0.7   0.4   0.8
#>  [8,]  0.6  0.7  0.9  0.7  0.6  0.8  0.7  0.0  1.0   0.4   0.6   0.5   1.0   0.7   0.9
#>  [9,]  0.6  0.7  0.9  0.7  0.6  0.8  0.7  1.0  0.0   0.4   0.6   0.5   1.0   0.7   0.9
#> [10,]  0.8  0.7  0.5  0.1  0.8  0.2  0.1  0.4  0.4   0.0   0.8   0.9   0.4   0.7   0.3
#> [11,]  1.0  0.9  0.7  0.3  1.0  0.4  0.3  0.6  0.6   0.8   0.0   0.9   0.6   0.9   0.5
#> [12,]  0.9  0.8  0.6  0.2  0.9  0.3  0.2  0.5  0.5   0.9   0.9   0.0   0.5   0.8   0.4
#> [13,]  0.6  0.7  0.9  0.7  0.6  0.8  0.7  1.0  1.0   0.4   0.6   0.5   0.0   0.7   0.9
#> [14,]  0.9  1.0  0.8  0.4  0.9  0.5  0.4  0.7  0.7   0.7   0.9   0.8   0.7   0.0   0.6
#> [15,]  0.5  0.6  0.8  0.8  0.5  0.9  0.8  0.9  0.9   0.3   0.5   0.4   0.9   0.6   0.0

我想這可能是您正在尋找的簡化,其中使用了outerifelse

下面是一個帶有虛擬數據的例子:

set.seed(1)
num_nodes <- 15
dahak <- sample(10,num_nodes,replace = TRUE)

如果你想要一個維度為weigth_listnum_nodes矩陣,那么你可以嘗試

weight_list <- (u<-ifelse((z<-abs(outer(dahak,dahak,FUN = "-")))!=0,1-z/10,1))-diag(diag(u))

以至於

> weight_list
      [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10] [,11] [,12] [,13] [,14] [,15]
 [1,]  0.0  0.5  0.8  0.2  0.3  0.8  0.3  0.4  0.2   0.6   0.6   0.9   0.7   0.9   0.8
 [2,]  0.5  0.0  0.7  0.7  0.8  0.7  0.8  0.9  0.7   0.9   0.9   0.4   0.8   0.4   0.7
 [3,]  0.8  0.7  0.0  0.4  0.5  1.0  0.5  0.6  0.4   0.8   0.8   0.7   0.9   0.7   1.0
 [4,]  0.2  0.7  0.4  0.0  0.9  0.4  0.9  0.8  1.0   0.6   0.6   0.1   0.5   0.1   0.4
 [5,]  0.3  0.8  0.5  0.9  0.0  0.5  1.0  0.9  0.9   0.7   0.7   0.2   0.6   0.2   0.5
 [6,]  0.8  0.7  1.0  0.4  0.5  0.0  0.5  0.6  0.4   0.8   0.8   0.7   0.9   0.7   1.0
 [7,]  0.3  0.8  0.5  0.9  1.0  0.5  0.0  0.9  0.9   0.7   0.7   0.2   0.6   0.2   0.5
 [8,]  0.4  0.9  0.6  0.8  0.9  0.6  0.9  0.0  0.8   0.8   0.8   0.3   0.7   0.3   0.6
 [9,]  0.2  0.7  0.4  1.0  0.9  0.4  0.9  0.8  0.0   0.6   0.6   0.1   0.5   0.1   0.4
[10,]  0.6  0.9  0.8  0.6  0.7  0.8  0.7  0.8  0.6   0.0   1.0   0.5   0.9   0.5   0.8
[11,]  0.6  0.9  0.8  0.6  0.7  0.8  0.7  0.8  0.6   1.0   0.0   0.5   0.9   0.5   0.8
[12,]  0.9  0.4  0.7  0.1  0.2  0.7  0.2  0.3  0.1   0.5   0.5   0.0   0.6   1.0   0.7
[13,]  0.7  0.8  0.9  0.5  0.6  0.9  0.6  0.7  0.5   0.9   0.9   0.6   0.0   0.6   0.9
[14,]  0.9  0.4  0.7  0.1  0.2  0.7  0.2  0.3  0.1   0.5   0.5   1.0   0.6   0.0   0.7
[15,]  0.8  0.7  1.0  0.4  0.5  1.0  0.5  0.6  0.4   0.8   0.8   0.7   0.9   0.7   0.0

暫無
暫無

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

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