簡體   English   中英

R 將嵌套的 for 循環轉換為 lapply() 以獲得更好的性能

[英]R convert nested for loop to lapply() for better performance

出於速度原因,我在將嵌套的for循環轉換為lapply()時遇到了困難。

我有 2 個data.table ,我正在遍歷每一行以比較它的內容,如果相等,則進行一些計算。 我花了超過 10 分鍾來計算我的大約 1000 行和 360 行的數據集。

在這個最小的例子中,它不到一秒,但每行只有 3 行:

library(data.table)
library(tictoc)

name <- c(rep("apple",2), rep("banana",2), rep("citrus", 2))
stim <- c("nc","alk" ,"nc",  "lem", "haz", "nc")
vis <- c(1, 1, 1, 1, 6, 7)
f <-c(2,2,2,1,3,3)
g <-c(2,2,2,2,4,4)
h <- c(rep(2,6))
value<- c(5,10,5,10,10,5)
  
tab <- data.table(name, stim, vis, f,g,h,value)

tab1 <- tab[stim == "nc"]
tab2 <- tab[!(stim == "nc")]


tic("looping")

for(i in 1:NROW(tab1)){
  for (n in 1: NROW((tab2))){
    if(identical(tab2[n,name],tab1[i,name])
       
    & identical(tab2[n,vis],tab1[i,vis])
      & identical(tab2[n,3:(length(tab2)-1), with = FALSE],tab1[i,3:(length(tab1)-1), with = FALSE])){
       
      tab2[n,"value"] <- tab2[n, "value"] - tab1[i,"value"]
    }  
  }
  
}
toc()

我一直在研究apply系列,這似乎是一種方法,但我不知道如何解決它。 我感謝任何幫助!

編輯:在循環之前, tab1看起來像這樣:

     name stim vis f g h value
1:  apple   nc   1 2 2 2     5
2: banana   nc   1 2 2 2     5
3: citrus   nc   7 3 4 2     5

tab2看起來像這樣:

     name stim vis f g h value
1:  apple  alk   1 2 2 2    10
2: banana  lem   1 1 2 2    10
3: citrus  haz   6 3 4 2    10

循環后(只對tab2感興趣),預期結果:

     name stim vis f g h value
1:  apple  alk   1 2 2 2     5
2: banana  lem   1 1 2 2    10
3: citrus  haz   6 3 4 2    10

應用循環不會加速您的計算。 事實上,這使它更慢,因為你已經有data.frames定義,你只是替換值。

相反,我建議使用合並的替代方法。 (注意:你的代碼有一些錯誤並且沒有運行,所以我希望我正確地解釋了你的意圖。如果沒有,讓我知道)。

> merge(tab1, tab2, by = c("name", "vis", "f", "g", "h"), suffixes=c("1", "2"), all.y=T) -> tab3
> tab3$value <- tab3$value2-tab3$value1
> tab3
    name vis f g h stim1 value1 stim2 value2 value
1  apple   1 2 2 2    nc      5   alk     10     5
2 banana   1 1 2 2  <NA>     NA   lem     10    NA
3 citrus   6 3 4 2  <NA>     NA   haz     10    NA

從那里您可以根據需要重命名或移動列。

暫無
暫無

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

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