主頁 > 後端開發 > 使用大型資料集的For回圈的極端處理時間

使用大型資料集的For回圈的極端處理時間

2022-01-19 07:15:25 後端開發

我準備了一個例程,將一個單元格(“DBH”)的值復制到另一行中的另一個單元格(“DG”),其中被復制的行緊跟在被復制的行之后(及時,而不是必須在表中)。

PlotID 'R8' 代表 8 個測量值,'R7' 代表第 7 個,依此類推。

該回圈旨在檢查該行是否具有先前的測量值,如果有,則記錄該測量值的唯一行識別符號。然后,它使用前面的行識別符號來搜索要通過第二個嵌套回圈復制的前面的記錄。

問題是我使用的完整資料集包含 650,000 條記錄以北。我知道這種結構會有些低效,但是當我運行它時,運行時每小時只移動大約 10,000 條記錄。有什么提高計算效率的建議嗎?

  # sort TreeInit Table to facilitate desired iteration
  FVS_TreeInit$StandPlotTree_ID <- paste(FVS_TreeInit$StandPlot_ID,"T",FVS_TreeInit$Tree_ID,sep="")
  
  # loop through FVS_TreeInit and add previous diameter increment identifier to current row
  for (i in seq_len(nrow(FVS_TreeInit))){
    if (FVS_TreeInit[i,"Plot_ID"] == "R8"){
      find <- paste(FVS_TreeInit[i,"Stand_ID"],"R7T",FVS_TreeInit[i,"Tree_ID"],sep="")
      for (f in seq_len(nrow(FVS_TreeInit))){
        if (FVS_TreeInit[f,"StandPlotTree_ID"] == find){
          FVS_TreeInit[i,"GD"] <- FVS_TreeInit[f,"DBH"]
          break
        }
      }
    } else if (FVS_TreeInit[i,"Plot_ID"] == "R7"){
      find <- paste(FVS_TreeInit[i,"Stand_ID"],"R6T",FVS_TreeInit[i,"Tree_ID"],sep="")
      for (f in seq_len(nrow(FVS_TreeInit))){
        if (FVS_TreeInit[f,"StandPlotTree_ID"] == find){
          FVS_TreeInit[i,"GD"] <- FVS_TreeInit[f,"DBH"]
          break
        }
      }
    } else if (FVS_TreeInit[i,"Plot_ID"] == "R6"){
      find <- paste(FVS_TreeInit[i,"Stand_ID"],"R5T",FVS_TreeInit[i,"Tree_ID"],sep="")
      for (f in seq_len(nrow(FVS_TreeInit))){
        if (FVS_TreeInit[f,"StandPlotTree_ID"] == find){
          FVS_TreeInit[i,"GD"] <- FVS_TreeInit[f,"DBH"]
          break
        }
      }
    } else if (FVS_TreeInit[i,"Plot_ID"] == "R5"){
      find <- paste(FVS_TreeInit[i,"Stand_ID"],"R4T",FVS_TreeInit[i,"Tree_ID"],sep="")
      for (f in seq_len(nrow(FVS_TreeInit))){
        if (FVS_TreeInit[f,"StandPlotTree_ID"] == find){
          FVS_TreeInit[i,"GD"] <- FVS_TreeInit[f,"DBH"]
          break
        }
      }
    } else if (FVS_TreeInit[i,"Plot_ID"] == "R4"){
      find <- paste(FVS_TreeInit[i,"Stand_ID"],"R3T",FVS_TreeInit[i,"Tree_ID"],sep="")
      for (f in seq_len(nrow(FVS_TreeInit))){
        if (FVS_TreeInit[f,"StandPlotTree_ID"] == find){
          FVS_TreeInit[i,"GD"] <- FVS_TreeInit[f,"DBH"]
          break
        }
      }
    } else if (FVS_TreeInit[i,"Plot_ID"] == "R3"){
      find <- paste(FVS_TreeInit[i,"Stand_ID"],"R2T",FVS_TreeInit[i,"Tree_ID"],sep="")
      for (f in seq_len(nrow(FVS_TreeInit))){
        if (FVS_TreeInit[f,"StandPlotTree_ID"] == find){
          FVS_TreeInit[i,"GD"] <- FVS_TreeInit[f,"DBH"]
          break
        }
      }
    } else if (FVS_TreeInit[i,"Plot_ID"] == "R2"){
      find <- paste(FVS_TreeInit[i,"Stand_ID"],"R1T",FVS_TreeInit[i,"Tree_ID"],sep="")
      for (f in seq_len(nrow(FVS_TreeInit))){
        if (FVS_TreeInit[f,"StandPlotTree_ID"] == find){
          FVS_TreeInit[i,"GD"] <- FVS_TreeInit[f,"DBH"]
          break
        }
      }
    } else if (FVS_TreeInit[i,"Plot_ID"] == "R1"){
      find <- paste(FVS_TreeInit[i,"Stand_ID"],"R0T",FVS_TreeInit[i,"Tree_ID"],sep="")
      for (f in seq_len(nrow(FVS_TreeInit))){
        if (FVS_TreeInit[f,"StandPlotTree_ID"] == find){
          FVS_TreeInit[i,"GD"] <- FVS_TreeInit[f,"DBH"]
          break
        }
      }
    } else{
      FVS_TreeInit[i,"GD"] <- NA
    }
    if (i%%1000 == 0){
      print(paste(i," rows iterated...",sep=""))
    }
  }
}

一些示例資料(.csv):

Stand_ID,Plot_ID,StandPlot_ID,Tree_ID,DBH,DG,Species,Age,StandPlotTree_ID,StandPlotTree_ID_Past
D18P186001,R0,D18P186001R0,1,4.76378225,,ABBA,,D18P186001R0T1,
D18P186001,R0,D18P186001R0,2,1.259843219,,BEPA,,D18P186001R0T2,
D18P186001,R0,D18P186001R0,3,0.275590695,,BEPA,,D18P186001R0T3,
D18P186001,R0,D18P186001R0,4,0.629921609,,BEPA,,D18P186001R0T4,
D18P186001,R0,D18P186001R0,5,0.1968505,,BEPA,,D18P186001R0T5,
D18P186001,R0,D18P186001R0,6,3.70078925,,ABBA,26,D18P186001R0T6,
D18P186001,R0,D18P186001R0,7,2.834647125,,ABBA,,D18P186001R0T7,
D18P186001,R0,D18P186001R0,8,1.259843219,,,,D18P186001R0T8,
D18P186001,R0,D18P186001R0,9,2.283465875,,,,D18P186001R0T9,
D18P186001,R0,D18P186001R0,10,1.181103,,,,D18P186001R0T10,
D18P186001,R0,D18P186001R0,11,1.535433938,,BEPA,,D18P186001R0T11,
D18P186001,R0,D18P186001R0,12,4.212600625,,ABBA,,D18P186001R0T12,
D18P186001,R0,D18P186001R0,13,3.30708825,,ABBA,,D18P186001R0T13,
D18P186001,R0,D18P186001R0,14,1.259843219,,ABBA,,D18P186001R0T14,
D18P186001,R0,D18P186001R0,15,4.212600625,,ABBA,28,D18P186001R0T15,
D18P186001,R0,D18P186001R0,16,3.149608,,ABBA,28,D18P186001R0T16,
D18P186001,R0,D18P186001R0,17,1.181103,,ABBA,,D18P186001R0T17,
D18P186001,R0,D18P186001R0,18,0.944882438,,BEPA,,D18P186001R0T18,
D18P186001,R0,D18P186001R0,19,0.393701,,BEPA,,D18P186001R0T19,
D18P186001,R0,D18P186001R0,20,0.314960805,,BEPA,,D18P186001R0T20,
D18P186001,R0,D18P186001R0,21,2.362206,,ABBA,22,D18P186001R0T21,
D18P186001,R0,D18P186001R0,22,0.314960805,,BEPA,,D18P186001R0T22,
D18P186001,R0,D18P186001R0,23,1.062992719,,ABBA,,D18P186001R0T23,
D18P186001,R0,D18P186001R0,24,3.93701,,ABBA,25,D18P186001R0T24,
D18P186001,R0,D18P186001R0,25,4.76378225,,ABBA,,D18P186001R0T25,
D18P186001,R0,D18P186001R0,26,0.748031891,,BEPA,,D18P186001R0T26,
D18P186001,R0,D18P186001R0,27,0.944882438,,BEPA,,D18P186001R0T27,
D18P186001,R0,D18P186001R0,28,3.267718375,,ABBA,,D18P186001R0T28,
D18P186001,R0,D18P186001R0,29,0.314960805,,BEPA,,D18P186001R0T29,
D18P186001,R0,D18P186001R0,30,0.472441219,,BEPA,,D18P186001R0T30,
D18P186001,R0,D18P186001R0,31,4.606301625,,ABBA,,D18P186001R0T31,
D18P186001,R0,D18P186001R0,32,4.055120375,,ABBA,,D18P186001R0T32,
D18P186001,R0,D18P186001R0,33,0.433071109,,,,D18P186001R0T33,
D18P186001,R0,D18P186001R0,34,1.023622562,,,,D18P186001R0T34,
D18P186001,R0,D18P186001R0,35,0.5905515,,,,D18P186001R0T35,
D18P186001,R0,D18P186001R0,36,0.748031891,,,,D18P186001R0T36,
D18P186001,R0,D18P186001R0,37,3.425198625,,ABBA,30,D18P186001R0T37,
D18P186001,R0,D18P186001R0,38,4.29134075,,ABBA,,D18P186001R0T38,
D18P186001,R0,D18P186001R0,39,3.93701,,ABBA,,D18P186001R0T39,
D18P186001,R0,D18P186001R0,40,4.251970875,,ABBA,,D18P186001R0T40,
D18P186001,R0,D18P186001R0,41,4.09449025,,ABBA,,D18P186001R0T41,
D18P186001,R0,D18P186001R0,42,6.181105625,,ABBA,24,D18P186001R0T42,
D18P186001,R0,D18P186001R0,43,3.858269875,,ABBA,,D18P186001R0T43,
D18P186001,R0,D18P186001R0,44,3.7401595,,ABBA,,D18P186001R0T44,
D18P186001,R0,D18P186001R0,45,0.5905515,,ABBA,,D18P186001R0T45,
D18P186001,R0,D18P186001R0,46,1.259843219,,ABBA,,D18P186001R0T46,
D18P186001,R0,D18P186001R0,47,3.89763975,,ABBA,,D18P186001R0T47,
D18P186001,R0,D18P186001R0,48,0.708661781,,ABBA,,D18P186001R0T48,
D18P186001,R0,D18P186001R0,49,0.314960805,,ABBA,,D18P186001R0T49,
D18P186001,R0,D18P186001R0,50,4.1338605,,ABBA,,D18P186001R0T50,
D18P186001,R0,D18P186001R0,51,1.889764875,,BEPA,,D18P186001R0T51,
D18P186001,R0,D18P186001R0,52,0.314960805,,,,D18P186001R0T52,
D18P186001,R0,D18P186001R0,53,0.629921609,,BEPA,,D18P186001R0T53,
D18P186001,R0,D18P186001R0,54,0.354330891,,BEPA,,D18P186001R0T54,
D18P186001,R0,D18P186001R0,55,1.456693719,,BEPA,,D18P186001R0T55,
D18P186001,R0,D18P186001R0,56,2.047245125,,,,D18P186001R0T56,
D18P186001,R0,D18P186001R0,57,2.480316375,,,,D18P186001R0T57,
D18P186001,R0,D18P186001R0,58,1.968505,,,,D18P186001R0T58,
D18P186001,R0,D18P186001R0,59,3.93701,,ABBA,,D18P186001R0T59,
D18P186001,R0,D18P186001R0,60,1.102362781,,ABBA,,D18P186001R0T60,
D18P186001,R0,D18P186001R0,61,0.472441219,,BEPA,,D18P186001R0T61,
D18P186001,R0,D18P186001R0,62,0.905512281,,BEPA,,D18P186001R0T62,
D18P186001,R0,D18P186001R0,63,0.944882438,,BEPA,,D18P186001R0T63,
D18P186001,R0,D18P186001R0,64,1.574804,,ABBA,,D18P186001R0T64,
D18P186001,R0,D18P186001R0,65,0.472441219,,BEPA,,D18P186001R0T65,
D18P186001,R0,D18P186001R0,66,5.15748325,,ABBA,,D18P186001R0T66,
D18P186001,R0,D18P186001R0,67,5.35433375,,ABBA,29,D18P186001R0T67,
D18P186001,R0,D18P186001R0,68,0.511811281,,ABBA,,D18P186001R0T68,
D18P186001,R0,D18P186001R0,69,4.68504175,,ABBA,,D18P186001R0T69,
D18P186001,R0,D18P186001R0,70,6.8897675,,ABBA,23,D18P186001R0T70,
D18P186001,R0,D18P186001R0,71,0.275590695,,BEPA,,D18P186001R0T71,
D18P186001,R0,D18P186001R0,72,4.606301625,,ABBA,20,D18P186001R0T72,
D18P186001,R0,D18P186001R0,73,0.511811281,,BEPA,,D18P186001R0T73,
D18P186001,R0,D18P186001R0,74,0.275590695,,BEPA,,D18P186001R0T74,
D18P186001,R0,D18P186001R0,75,0.393701,,BEPA,,D18P186001R0T75,
D18P186001,R0,D18P186001R0,76,0.472441219,,BEPA,,D18P186001R0T76,
D18P186001,R0,D18P186001R0,77,0.669291719,,ABBA,,D18P186001R0T77,
D18P186001,R0,D18P186001R0,78,0.354330891,,BEPA,,D18P186001R0T78,
D18P186001,R0,D18P186001R0,79,4.409451125,,ABBA,,D18P186001R0T79,
D18P186001,R0,D18P186001R0,80,7.12598825,,ABBA,,D18P186001R0T80,
D18P186001,R0,D18P186001R0,81,4.724412,,ABBA,,D18P186001R0T81,
D18P186001,R1,D18P186001R1,1,5.86614475,,ABBA,,D18P186001R1T1,
D18P186001,R1,D18P186001R1,2,1.3779535,,BEPA,,D18P186001R1T2,
D18P186001,R1,D18P186001R1,3,,,BEPA,,D18P186001R1T3,
D18P186001,R1,D18P186001R1,4,,,BEPA,,D18P186001R1T4,
D18P186001,R1,D18P186001R1,5,0.236220609,,BEPA,,D18P186001R1T5,
D18P186001,R1,D18P186001R1,6,4.1338605,,ABBA,31,D18P186001R1T6,
D18P186001,R1,D18P186001R1,7,3.425198625,,ABBA,,D18P186001R1T7,
D18P186001,R1,D18P186001R1,9,2.480316375,,,,D18P186001R1T9,
D18P186001,R1,D18P186001R1,10,1.259843219,,,,D18P186001R1T10,
D18P186001,R1,D18P186001R1,11,1.574804,,BEPA,,D18P186001R1T11,
D18P186001,R1,D18P186001R1,12,4.88189225,,ABBA,,D18P186001R1T12,
D18P186001,R1,D18P186001R1,13,3.89763975,,ABBA,,D18P186001R1T13,
D18P186001,R1,D18P186001R1,14,1.3779535,,ABBA,,D18P186001R1T14,
D18P186001,R1,D18P186001R1,15,5.196853125,,ABBA,33,D18P186001R1T15,
D18P186001,R1,D18P186001R1,16,4.055120375,,ABBA,33,D18P186001R1T16,
D18P186001,R1,D18P186001R1,17,1.220473062,,ABBA,,D18P186001R1T17,
D18P186001,R1,D18P186001R1,18,0.9842525,,BEPA,,D18P186001R1T18,
D18P186001,R1,D18P186001R1,19,0.393701,,BEPA,,D18P186001R1T19,
D18P186001,R1,D18P186001R1,20,0.472441219,,BEPA,,D18P186001R1T20,
D18P186001,R1,D18P186001R1,21,2.716536938,,ABBA,27,D18P186001R1T21,
D18P186001,R1,D18P186001R1,22,,,BEPA,,D18P186001R1T22,
D18P186001,R1,D18P186001R1,23,1.181103,,ABBA,,D18P186001R1T23,
D18P186001,R1,D18P186001R1,24,5.000002625,,ABBA,30,D18P186001R1T24,
D18P186001,R1,D18P186001R1,25,4.88189225,,ABBA,,D18P186001R1T25,
D18P186001,R1,D18P186001R1,26,,,BEPA,,D18P186001R1T26,
D18P186001,R1,D18P186001R1,27,1.023622562,,BEPA,,D18P186001R1T27,
D18P186001,R1,D18P186001R1,28,4.330711,,ABBA,,D18P186001R1T28,
D18P186001,R1,D18P186001R1,29,0.354330891,,BEPA,,D18P186001R1T29,
D18P186001,R1,D18P186001R1,30,0.511811281,,BEPA,,D18P186001R1T30,
D18P186001,R1,D18P186001R1,31,5.74803475,,ABBA,,D18P186001R1T31,
D18P186001,R1,D18P186001R1,32,5.27559325,,ABBA,,D18P186001R1T32,
D18P186001,R1,D18P186001R1,33,,,,,D18P186001R1T33,
D18P186001,R1,D18P186001R1,34,0.944882438,,,,D18P186001R1T34,
D18P186001,R1,D18P186001R1,35,0.669291719,,,,D18P186001R1T35,
D18P186001,R1,D18P186001R1,36,1.062992719,,,,D18P186001R1T36,
D18P186001,R1,D18P186001R1,37,4.5275615,,ABBA,35,D18P186001R1T37,
D18P186001,R1,D18P186001R1,38,5.629924375,,ABBA,,D18P186001R1T38,
D18P186001,R1,D18P186001R1,39,4.88189225,,ABBA,,D18P186001R1T39,
D18P186001,R1,D18P186001R1,40,5.47244375,,ABBA,,D18P186001R1T40,
D18P186001,R1,D18P186001R1,41,4.842522375,,ABBA,,D18P186001R1T41,
D18P186001,R1,D18P186001R1,42,7.204728,,ABBA,29,D18P186001R1T42,
D18P186001,R1,D18P186001R1,43,4.842522375,,ABBA,,D18P186001R1T43,
D18P186001,R1,D18P186001R1,44,4.606301625,,ABBA,,D18P186001R1T44,
D18P186001,R1,D18P186001R1,45,0.748031891,,ABBA,,D18P186001R1T45,
D18P186001,R1,D18P186001R1,46,1.3779535,,ABBA,,D18P186001R1T46,
D18P186001,R1,D18P186001R1,47,4.37008125,,ABBA,,D18P186001R1T47,
D18P186001,R1,D18P186001R1,48,0.9842525,,ABBA,,D18P186001R1T48,
D18P186001,R1,D18P186001R1,49,0.354330891,,ABBA,,D18P186001R1T49,
D18P186001,R1,D18P186001R1,50,5.07874275,,ABBA,,D18P186001R1T50,
D18P186001,R1,D18P186001R1,51,2.401576062,,BEPA,,D18P186001R1T51,
D18P186001,R1,D18P186001R1,52,,,,,D18P186001R1T52,
D18P186001,R1,D18P186001R1,53,,,BEPA,,D18P186001R1T53,
D18P186001,R1,D18P186001R1,54,,,BEPA,,D18P186001R1T54,
D18P186001,R1,D18P186001R1,55,1.614174062,,BEPA,,D18P186001R1T55,
D18P186001,R1,D18P186001R1,56,2.401576062,,,,D18P186001R1T56,
D18P186001,R1,D18P186001R1,57,2.992127562,,,,D18P186001R1T57,
D18P186001,R1,D18P186001R1,58,2.204725562,,,,D18P186001R1T58,
D18P186001,R1,D18P186001R1,59,4.96063275,,ABBA,,D18P186001R1T59,
D18P186001,R1,D18P186001R1,60,1.456693719,,ABBA,,D18P186001R1T60,
D18P186001,R1,D18P186001R1,61,,,BEPA,,D18P186001R1T61,
D18P186001,R1,D18P186001R1,62,0.905512281,,BEPA,,D18P186001R1T62,
D18P186001,R1,D18P186001R1,63,1.023622562,,BEPA,,D18P186001R1T63,
D18P186001,R1,D18P186001R1,64,1.732284438,,ABBA,,D18P186001R1T64,
D18P186001,R1,D18P186001R1,65,0.629921609,,BEPA,,D18P186001R1T65,
D18P186001,R1,D18P186001R1,66,6.65354675,,ABBA,,D18P186001R1T66,
D18P186001,R1,D18P186001R1,67,7.204728,,ABBA,34,D18P186001R1T67,
D18P186001,R1,D18P186001R1,68,1.259843219,,ABBA,,D18P186001R1T68,
D18P186001,R1,D18P186001R1,69,5.66929425,,ABBA,,D18P186001R1T69,
D18P186001,R1,D18P186001R1,70,7.6771695,,ABBA,28,D18P186001R1T70,
D18P186001,R1,D18P186001R1,71,0.5905515,,BEPA,,D18P186001R1T71,
D18P186001,R1,D18P186001R1,72,5.629924375,,ABBA,25,D18P186001R1T72,
D18P186001,R1,D18P186001R1,73,0.275590695,,BEPA,,D18P186001R1T73,
D18P186001,R1,D18P186001R1,74,0.314960805,,BEPA,,D18P186001R1T74,
D18P186001,R1,D18P186001R1,75,0.354330891,,BEPA,,D18P186001R1T75,
D18P186001,R1,D18P186001R1,76,0.472441219,,BEPA,,D18P186001R1T76,
D18P186001,R1,D18P186001R1,77,0.944882438,,ABBA,,D18P186001R1T77,
D18P186001,R1,D18P186001R1,78,0.393701,,BEPA,,D18P186001R1T78,
D18P186001,R1,D18P186001R1,79,5.433073875,,ABBA,,D18P186001R1T79,
D18P186001,R1,D18P186001R1,80,8.03150025,,ABBA,,D18P186001R1T80,
D18P186001,R1,D18P186001R1,81,,,ABBA,,D18P186001R1T81,
D18P186001,R1,D18P186001R1,82,0.157480402,,BEPA,,D18P186001R1T82,
D18P186001,R1,D18P186001R1,83,0.118110305,,BEPA,,D18P186001R1T83,
D18P186001,R1,D18P186001R1,84,0.118110305,,BEPA,,D18P186001R1T84,
D18P186001,R1,D18P186001R1,85,0.118110305,,BEPA,,D18P186001R1T85,
D18P186001,R1,D18P186001R1,86,0.118110305,,BEPA,,D18P186001R1T86,
D18P186001,R1,D18P186001R1,87,0.157480402,,BEPA,,D18P186001R1T87,
D18P186001,R1,D18P186001R1,88,0.275590695,,BEPA,,D18P186001R1T88,
D18P186001,R1,D18P186001R1,89,1.102362781,,BEPA,,D18P186001R1T89,
D18P186001,R1,D18P186001R1,90,0.314960805,,BEPA,,D18P186001R1T90,
D18P186001,R1,D18P186001R1,91,0.1968505,,BEPA,,D18P186001R1T91,
D18P186001,R1,D18P186001R1,92,0.629921609,,ABBA,,D18P186001R1T92,
D18P186001,R1,D18P186001R1,93,0.1968505,,ABBA,,D18P186001R1T93,
D18P186001,R1,D18P186001R1,94,0.393701,,ABBA,,D18P186001R1T94,
D18P186001,R1,D18P186001R1,95,0.314960805,,BEPA,,D18P186001R1T95,
D18P186001,R1,D18P186001R1,96,0.393701,,BEPA,,D18P186001R1T96,
D18P186001,R1,D18P186001R1,97,0.275590695,,BEPA,,D18P186001R1T97,
D18P186001,R1,D18P186001R1,98,0.393701,,BEPA,,D18P186001R1T98,
D18P186001,R1,D18P186001R1,99,0.354330891,,BEPA,,D18P186001R1T99,
D18P186001,R1,D18P186001R1,100,0.354330891,,BEPA,,D18P186001R1T100,
D18P186001,R2,D18P186001R2,1,6.3779565,,ABBA,,D18P186001R2T1,
D18P186001,R2,D18P186001R2,2,1.417323562,,BEPA,,D18P186001R2T2,
D18P186001,R2,D18P186001R2,3,,,BEPA,,D18P186001R2T3,
D18P186001,R2,D18P186001R2,4,,,BEPA,,D18P186001R2T4,
D18P186001,R2,D18P186001R2,5,0.314960805,,BEPA,,D18P186001R2T5,
D18P186001,R2,D18P186001R2,6,4.251970875,,ABBA,33,D18P186001R2T6,
D18P186001,R2,D18P186001R2,7,3.58267925,,ABBA,,D18P186001R2T7,
D18P186001,R2,D18P186001R2,8,,,,,D18P186001R2T8,
D18P186001,R2,D18P186001R2,9,2.5590565,,,,D18P186001R2T9,
D18P186001,R2,D18P186001R2,10,1.220473062,,,,D18P186001R2T10,
D18P186001,R2,D18P186001R2,11,1.614174062,,BEPA,,D18P186001R2T11,
D18P186001,R2,D18P186001R2,12,5.07874275,,ABBA,,D18P186001R2T12,
D18P186001,R2,D18P186001R2,13,4.1338605,,ABBA,,D18P186001R2T13,
D18P186001,R2,D18P186001R2,14,1.3779535,,ABBA,,D18P186001R2T14,
D18P186001,R2,D18P186001R2,15,5.433073875,,ABBA,35,D18P186001R2T15,
D18P186001,R2,D18P186001R2,16,4.37008125,,ABBA,35,D18P186001R2T16,
D18P186001,R2,D18P186001R2,17,1.220473062,,ABBA,,D18P186001R2T17,
D18P186001,R2,D18P186001R2,18,1.181103,,BEPA,,D18P186001R2T18,
D18P186001,R2,D18P186001R2,19,0.393701,,BEPA,,D18P186001R2T19,
D18P186001,R2,D18P186001R2,20,0.551181391,,BEPA,,D18P186001R2T20,
D18P186001,R2,D18P186001R2,21,2.834647125,,ABBA,29,D18P186001R2T21,
D18P186001,R2,D18P186001R2,22,,,BEPA,,D18P186001R2T22,
D18P186001,R2,D18P186001R2,23,1.259843219,,ABBA,,D18P186001R2T23,
D18P186001,R2,D18P186001R2,24,5.3149635,,ABBA,32,D18P186001R2T24,
D18P186001,R2,D18P186001R2,25,5.039372875,,ABBA,,D18P186001R2T25,
D18P186001,R2,D18P186001R2,26,,,BEPA,,D18P186001R2T26,
D18P186001,R2,D18P186001R2,27,0.9842525,,BEPA,,D18P186001R2T27,
D18P186001,R2,D18P186001R2,28,4.48819125,,ABBA,,D18P186001R2T28,
D18P186001,R2,D18P186001R2,29,0.393701,,BEPA,,D18P186001R2T29,
D18P186001,R2,D18P186001R2,30,0.551181391,,BEPA,,D18P186001R2T30,
D18P186001,R2,D18P186001R2,31,6.06299525,,ABBA,,D18P186001R2T31,
D18P186001,R2,D18P186001R2,32,5.55118425,,ABBA,,D18P186001R2T32,
D18P186001,R2,D18P186001R2,33,,,,,D18P186001R2T33,
D18P186001,R2,D18P186001R2,34,1.023622562,,,,D18P186001R2T34,
D18P186001,R2,D18P186001R2,35,0.905512281,,,,D18P186001R2T35,
D18P186001,R2,D18P186001R2,36,1.141732938,,,,D18P186001R2T36,
D18P186001,R2,D18P186001R2,37,4.76378225,,ABBA,37,D18P186001R2T37,
D18P186001,R2,D18P186001R2,38,5.94488525,,ABBA,,D18P186001R2T38,
D18P186001,R2,D18P186001R2,39,5.118113,,ABBA,,D18P186001R2T39,
D18P186001,R2,D18P186001R2,40,5.826774875,,ABBA,,D18P186001R2T40,
D18P186001,R2,D18P186001R2,41,5.039372875,,ABBA,,D18P186001R2T41,
D18P186001,R2,D18P186001R2,42,7.5590595,,ABBA,31,D18P186001R2T42,
D18P186001,R2,D18P186001R2,43,5.07874275,,ABBA,,D18P186001R2T43,
D18P186001,R2,D18P186001R2,44,4.842522375,,ABBA,,D18P186001R2T44,
D18P186001,R2,D18P186001R2,45,0.748031891,,ABBA,,D18P186001R2T45,
D18P186001,R2,D18P186001R2,46,1.417323562,,ABBA,,D18P186001R2T46,
D18P186001,R2,D18P186001R2,47,4.5275615,,ABBA,,D18P186001R2T47,
D18P186001,R2,D18P186001R2,48,1.102362781,,ABBA,,D18P186001R2T48,
D18P186001,R2,D18P186001R2,49,0.5905515,,ABBA,,D18P186001R2T49,
D18P186001,R2,D18P186001R2,50,5.27559325,,ABBA,,D18P186001R2T50,
D18P186001,R2,D18P186001R2,51,2.5590565,,BEPA,,D18P186001R2T51,
D18P186001,R2,D18P186001R2,52,,,,,D18P186001R2T52,
D18P186001,R2,D18P186001R2,53,,,BEPA,,D18P186001R2T53,
D18P186001,R2,D18P186001R2,54,,,BEPA,,D18P186001R2T54,
D18P186001,R2,D18P186001R2,55,1.653544125,,BEPA,,D18P186001R2T55,
D18P186001,R2,D18P186001R2,56,2.401576062,,,,D18P186001R2T56,
D18P186001,R2,D18P186001R2,57,3.149608,,,,D18P186001R2T57,
D18P186001,R2,D18P186001R2,58,2.440946125,,,,D18P186001R2T58,
D18P186001,R2,D18P186001R2,59,5.15748325,,ABBA,,D18P186001R2T59,
D18P186001,R2,D18P186001R2,60,1.653544125,,ABBA,,D18P186001R2T60,
D18P186001,R2,D18P186001R2,61,,,BEPA,,D18P186001R2T61,
D18P186001,R2,D18P186001R2,62,0.944882438,,BEPA,,D18P186001R2T62,
D18P186001,R2,D18P186001R2,63,1.102362781,,BEPA,,D18P186001R2T63,
D18P186001,R2,D18P186001R2,64,1.811024562,,ABBA,,D18P186001R2T64,
D18P186001,R2,D18P186001R2,65,0.708661781,,BEPA,,D18P186001R2T65,
D18P186001,R2,D18P186001R2,66,7.12598825,,ABBA,,D18P186001R2T66,
D18P186001,R2,D18P186001R2,67,7.51968925,,ABBA,36,D18P186001R2T67,
D18P186001,R2,D18P186001R2,68,1.3779535,,ABBA,,D18P186001R2T68,
D18P186001,R2,D18P186001R2,69,6.14173575,,ABBA,,D18P186001R2T69,
D18P186001,R2,D18P186001R2,70,8.89764275,,ABBA,30,D18P186001R2T70,
D18P186001,R2,D18P186001R2,71,0.787402,,BEPA,,D18P186001R2T71,
D18P186001,R2,D18P186001R2,72,5.826774875,,ABBA,27,D18P186001R2T72,
D18P186001,R2,D18P186001R2,73,0.354330891,,BEPA,,D18P186001R2T73,
D18P186001,R2,D18P186001R2,74,0.511811281,,BEPA,,D18P186001R2T74,
D18P186001,R2,D18P186001R2,75,0.433071109,,BEPA,,D18P186001R2T75,
D18P186001,R2,D18P186001R2,76,0.551181391,,BEPA,,D18P186001R2T76,
D18P186001,R2,D18P186001R2,77,1.062992719,,ABBA,,D18P186001R2T77,
D18P186001,R2,D18P186001R2,78,0.511811281,,BEPA,,D18P186001R2T78,
D18P186001,R2,D18P186001R2,79,5.826774875,,ABBA,,D18P186001R2T79,
D18P186001,R2,D18P186001R2,80,8.50394175,,ABBA,,D18P186001R2T80,
D18P186001,R2,D18P186001R2,81,,,ABBA,,D18P186001R2T81,
D18P186001,R2,D18P186001R2,82,0.157480402,,BEPA,,D18P186001R2T82,
D18P186001,R2,D18P186001R2,83,0.118110305,,BEPA,,D18P186001R2T83,
D18P186001,R2,D18P186001R2,84,,,BEPA,,D18P186001R2T84,
D18P186001,R2,D18P186001R2,85,,,BEPA,,D18P186001R2T85,
D18P186001,R2,D18P186001R2,86,0.118110305,,BEPA,,D18P186001R2T86,
D18P186001,R2,D18P186001R2,87,,,BEPA,,D18P186001R2T87,
D18P186001,R2,D18P186001R2,88,0.314960805,,BEPA,,D18P186001R2T88,
D18P186001,R2,D18P186001R2,89,,,BEPA,,D18P186001R2T89,
D18P186001,R2,D18P186001R2,90,0.433071109,,BEPA,,D18P186001R2T90,
D18P186001,R2,D18P186001R2,91,0.078740201,,BEPA,,D18P186001R2T91,
D18P186001,R2,D18P186001R2,92,0.708661781,,ABBA,,D18P186001R2T92,
D18P186001,R2,D18P186001R2,93,0.393701,,ABBA,,D18P186001R2T93,
D18P186001,R2,D18P186001R2,94,0.472441219,,ABBA,,D18P186001R2T94,
D18P186001,R2,D18P186001R2,95,,,BEPA,,D18P186001R2T95,
D18P186001,R2,D18P186001R2,96,0.393701,,BEPA,,D18P186001R2T96,
D18P186001,R2,D18P186001R2,97,0.393701,,BEPA,,D18P186001R2T97,
D18P186001,R2,D18P186001R2,98,0.393701,,BEPA,,D18P186001R2T98,
D18P186001,R2,D18P186001R2,99,0.472441219,,BEPA,,D18P186001R2T99,
D18P186001,R2,D18P186001R2,100,0.433071109,,BEPA,,D18P186001R2T100,
D18P186001,R3,D18P186001R3,1,6.92913775,,ABBA,,D18P186001R3T1,
D18P186001,R3,D18P186001R3,2,1.456693719,,BEPA,,D18P186001R3T2,
D18P186001,R3,D18P186001R3,3,,,BEPA,,D18P186001R3T3,
D18P186001,R3,D18P186001R3,4,,,BEPA,,D18P186001R3T4,
D18P186001,R3,D18P186001R3,5,,,BEPA,,D18P186001R3T5,
D18P186001,R3,D18P186001R3,6,4.48819125,,ABBA,37,D18P186001R3T6,
D18P186001,R3,D18P186001R3,7,3.858269875,,ABBA,,D18P186001R3T7,
D18P186001,R3,D18P186001R3,8,,,,,D18P186001R3T8,
D18P186001,R3,D18P186001R3,9,2.716536938,,,,D18P186001R3T9,
D18P186001,R3,D18P186001R3,10,,,,,D18P186001R3T10,
D18P186001,R3,D18P186001R3,11,1.535433938,,BEPA,,D18P186001R3T11,
D18P186001,R3,D18P186001R3,12,5.590554125,,ABBA,,D18P186001R3T12,
D18P186001,R3,D18P186001R3,13,4.37008125,,ABBA,,D18P186001R3T13,
D18P186001,R3,D18P186001R3,14,1.338583438,,ABBA,,D18P186001R3T14,
D18P186001,R3,D18P186001R3,15,5.984255125,,ABBA,39,D18P186001R3T15,
D18P186001,R3,D18P186001R3,16,4.88189225,,ABBA,39,D18P186001R3T16,
D18P186001,R3,D18P186001R3,17,1.338583438,,ABBA,,D18P186001R3T17,
D18P186001,R3,D18P186001R3,18,1.141732938,,BEPA,,D18P186001R3T18,
D18P186001,R3,D18P186001R3,19,,,BEPA,,D18P186001R3T19,
D18P186001,R3,D18P186001R3,20,0.669291719,,BEPA,,D18P186001R3T20,
D18P186001,R3,D18P186001R3,21,3.070867875,,ABBA,33,D18P186001R3T21,
D18P186001,R3,D18P186001R3,22,,,BEPA,,D18P186001R3T22,
D18P186001,R3,D18P186001R3,23,1.259843219,,ABBA,,D18P186001R3T23,
D18P186001,R3,D18P186001R3,24,5.905515,,ABBA,36,D18P186001R3T24,
D18P186001,R3,D18P186001R3,25,5.433073875,,ABBA,,D18P186001R3T25,
D18P186001,R3,D18P186001R3,26,,,BEPA,,D18P186001R3T26,
D18P186001,R3,D18P186001R3,27,1.023622562,,BEPA,,D18P186001R3T27,
D18P186001,R3,D18P186001R3,28,4.96063275,,ABBA,,D18P186001R3T28,
D18P186001,R3,D18P186001R3,29,,,BEPA,,D18P186001R3T29,
D18P186001,R3,D18P186001R3,30,0.511811281,,BEPA,,D18P186001R3T30,
D18P186001,R3,D18P186001R3,31,6.6141765,,ABBA,,D18P186001R3T31,
D18P186001,R3,D18P186001R3,32,6.06299525,,ABBA,,D18P186001R3T32,
D18P186001,R3,D18P186001R3,33,,,,,D18P186001R3T33,
D18P186001,R3,D18P186001R3,34,0.9842525,,,,D18P186001R3T34,
D18P186001,R3,D18P186001R3,35,,,,,D18P186001R3T35,
D18P186001,R3,D18P186001R3,36,1.220473062,,,,D18P186001R3T36,
D18P186001,R3,D18P186001R3,37,5.236223375,,ABBA,41,D18P186001R3T37,
D18P186001,R3,D18P186001R3,38,6.4960665,,ABBA,,D18P186001R3T38,

uj5u.com熱心網友回復:

真正的答案

基本上,您撰寫的代碼就像您用其他語言撰寫了很多但從未使用過的代碼一樣R由于所有嵌套回圈,很難準確理解發生了什么,而且我還沒有運行您的代碼(請參閱此處了解如何可重現地包含資料)。

我認為盡管可以洗掉所有回圈,例如將第一個條件替換為:

FVS_TreeInit$GD[
    FVS_TreeInit$Plot_ID == "R8" & 
    FVS_TreeInit$StandPlotTree_ID == paste(FVS_TreeInit$Stand_ID,"R7T",FVS_TreeInit$Tree_ID,sep="")
    ]  <- FVS_TreeInit$DBH

如果您使用(here)明顯更快,因為它的實作速度如此之快。data.table

便宜又簡單的答案

有一種既便宜又簡單的方法可以在不重構所有代碼的情況下加速你所擁有的東西,但它仍然會很慢。

問題是您經常使用df[i, "columnName"]. 這是一種非常緩慢的方法。看看這個例子。

創建兩個隨機的大(10e6行)字串資料框:

# Random data function borrowed from: https://www.r-bloggers.com/2017/03/fast-data-lookups-in-r-dplyr-vs-data-table/
random_string_column <- function(n) {
  stringi::stri_rand_strings(n = n, length = 8)
}
random_data_frame <- function(n) tibble(
  col1 = random_string_column(n),
  col2 = random_string_column(n)
)
df <- random_data_frame(10^6)
df2 <- random_data_frame(10^6)
head(df)

輸出(df2 類似):

# A tibble: 6 x 2
  col1     col2
  <chr>    <chr>   
1 NykzxkNO qGusGkMa
2 mgivTVky xlCtwEba
3 zar6FbC4 dOYeQPfg
4 89fKLJFv RPsP2CZc
5 V2FH3Smt ObToBJFC
6 gXa0j5XZ QYKK6hD2

現在讓我們按照自己的方式進行 1000 次隨機查找:

rand_indeces  <- sample(c(1:nrow(df), 1000))
system.time(
    for(i in rand_indeces) {
        if(df[i, "col2"]=="aaaaa") { #it never will
            break
        }
    }
)

輸出:

   user  system elapsed 
 138.58    0.23  140.72

兩分鐘多。現在讓我們看看另一個資料框(新的df,所以我們可以看到它不是因為快取),df[i, "col2"]=="aaaaa"df2$col2[i] == "aaaaa".

system.time(
    for(i in rand_indeces) {
        if(df2$col2[i] == "aaaaa") { #it never will
            break
        }
    }
)

輸出:

   user  system elapsed 
   4.70    0.00    4.75

這應該可以為您節省不少時間。但是,從根本上說,在 R 中以這種方式進行查找很慢(請參閱此處此處)。

如果您必須進行單獨查找,您可以考慮創建一個哈希表,或者通過第一個鏈接中的方法或通過這里environments的一些較新的方法我覺得這個包看起來很有趣——還沒用過。collections

但是,到目前為止,最好的辦法是對您的代碼進行矢量化,如本回復頂部所述。

uj5u.com熱心網友回復:

(劇透:跳到雙重合并部分以獲得比嵌套回圈快 150 倍的結果。我希望這種速度改進會隨著更大的資料而變得更好。)

中級改進

首先,您的內部回圈都可以從for回圈中減少到更快,也許會改變

      find <- paste(FVS_TreeInit[i,"Stand_ID"],"R0T",FVS_TreeInit[i,"Tree_ID"],sep="")
      for (f in seq_len(nrow(FVS_TreeInit))){
        if (FVS_TreeInit[f,"StandPlotTree_ID"] == find){
          FVS_TreeInit[i,"GD"] <- FVS_TreeInit[f,"DBH"]
          break
        }
      }

      find <- paste(FVS_TreeInit[i,"Stand_ID"],"R0T",FVS_TreeInit[i,"Tree_ID"],sep="")
      f <- FVS_TreeInit[,"StandPlotTree_ID"] == find
      FVS_TreeInit[i,"GD"] <- FVS_TreeInit[f,"DBH"]

值得注意的是,我們已經從迭代for回圈變為矢量化比較,這在 R 中往往要快得多。但是,應該注意我們對幾個 做同樣的事情"R*",所以我們可以大大減少你的外回圈;其中大部分是代碼高爾夫(減少字符數來做同樣的事情),但一般不要重復自己“:如果你在多個地方有相同(相同)的代碼,你會增加改變一個的機會而不是所有其他人。

在該主題中,到目前為止,我可以使用以下方法獲得相同的結果:

  # loop through FVS_TreeInit and add previous diameter increment identifier to current row
  for (i in seq_len(nrow(FVS_TreeInit))){
    if (FVS_TreeInit[i,"Plot_ID"] == "R8"){
      find <- paste(FVS_TreeInit[i,"Stand_ID"],"R7T",FVS_TreeInit[i,"Tree_ID"],sep="")
    } else if (FVS_TreeInit[i,"Plot_ID"] == "R7"){
      find <- paste(FVS_TreeInit[i,"Stand_ID"],"R6T",FVS_TreeInit[i,"Tree_ID"],sep="")
    } else if (FVS_TreeInit[i,"Plot_ID"] == "R6"){
      find <- paste(FVS_TreeInit[i,"Stand_ID"],"R5T",FVS_TreeInit[i,"Tree_ID"],sep="")
    } else if (FVS_TreeInit[i,"Plot_ID"] == "R5"){
      find <- paste(FVS_TreeInit[i,"Stand_ID"],"R4T",FVS_TreeInit[i,"Tree_ID"],sep="")
    } else if (FVS_TreeInit[i,"Plot_ID"] == "R4"){
      find <- paste(FVS_TreeInit[i,"Stand_ID"],"R3T",FVS_TreeInit[i,"Tree_ID"],sep="")
    } else if (FVS_TreeInit[i,"Plot_ID"] == "R3"){
      find <- paste(FVS_TreeInit[i,"Stand_ID"],"R2T",FVS_TreeInit[i,"Tree_ID"],sep="")
    } else if (FVS_TreeInit[i,"Plot_ID"] == "R2"){
      find <- paste(FVS_TreeInit[i,"Stand_ID"],"R1T",FVS_TreeInit[i,"Tree_ID"],sep="")
    } else if (FVS_TreeInit[i,"Plot_ID"] == "R1"){
      find <- paste(FVS_TreeInit[i,"Stand_ID"],"R0T",FVS_TreeInit[i,"Tree_ID"],sep="")
    } else {
      find <- NA
    }
    FVS_TreeInit[i,"GD"] <- NA
    if (!is.na(find)) {
      f <- FVS_TreeInit[,"StandPlotTree_ID"] == find
      if (any(f)) FVS_TreeInit[i,"GD"] <- FVS_TreeInit[f,"DBH"]
    }
    if (i%%1000 == 0){
      print(paste(i," rows iterated...",sep=""))
    }
  }

好的,這更短,并縮小到真正重要的內容。值得注意的是(對我而言),我們基于某些特定值有效地將資料“連接”在一起。我認為我們可以通過更簡單的步驟(合并)來完成所有這些作業。

雙重合并

這實際上只是基于三個 ID 將資料連接回自身:Stand_IDTree_IDPlot_ID,其中后者是時間組件(因此需要針對自連接進行調整)。

源于您的R*值反映時間的想法,我認為我們可以安全地假設R(n)應該分配給R(n 1),所以讓我們以編程方式創建這個中間框架:

prevPlot <- data.frame(prev_Plot_ID = unique(FVS_TreeInit$Plot_ID))
prevPlot$Plot_ID <- paste0("R", as.integer(gsub("R", "", prevPlot$prev_Plot_ID))-1)
prevPlot <- subset(prevPlot, prev_Plot_ID != "R0")
prevPlot
#   prev_Plot_ID Plot_ID
# 2           R1      R0
# 3           R2      R1
# 4           R3      R2

We'll merge/join this onto the original FVS_Tree_Init in order to identify the "previous Plot_ID" and then merge back on itself to bring in the new value.

prevValues <- subset(merge(FVS_TreeInit, prevPlot, by = "Plot_ID", all.x = TRUE),
                     select = c(Stand_ID, prev_Plot_ID, Tree_ID, DBH))
names(prevValues)[4] <- "GD"
head(prevValues)
#     Stand_ID prev_Plot_ID Tree_ID        GD
# 1 D18P186001           R1      39 3.9370100
# 2 D18P186001           R1      40 4.2519709
# 3 D18P186001           R1       1 4.7637823
# 4 D18P186001           R1       2 1.2598432
# 5 D18P186001           R1       3 0.2755907
# 6 D18P186001           R1       4 0.6299216
new_FVS_TreeInit <- merge(
  FVS_TreeInit, prevValues,
  by.x = c("Stand_ID", "Plot_ID", "Tree_ID"),
  by.y = c("Stand_ID", "prev_Plot_ID", "Tree_ID"),
  all.x = TRUE)
identical(expected, new_FVS_TreeInit[names(expected)])
# [1] TRUE

where expected is the output from your nested for loop, and new_FVS_TreeInit[names(expected)] is just a step to ensure all columns are in the same order (for comparison with identical, not required for data processing).

僅供參考,這突出了您使用連接字串作為單數鍵的矛盾(一種相當 Excel 的連接方法......它確實有效),前提是在一個或多個鍵上合并/連接資料。一旦你摒棄了單鍵 Excel 方法并認識到一個或多個方法也同樣有效——并且更易于閱讀和維護——我認為將思維方式轉變為合并可以改變編程。請參閱如何加入(合并)資料幀(內、外、左、右)INNER JOIN、LEFT JOIN、RIGHT JOIN 和 FULL JOIN 有什么區別?有關連接的“演算”的更多討論。


基準

使用此示例資料,它的執行速度提高了大約 150

bench::mark(
  forloop = {
   # your code
  },
  doublemerge = {
    # my code
  }
)
# Warning: Some expressions had a GC in every iteration; so filtering is disabled.
# # A tibble: 2 x 13
#   expression       min   median `itr/sec` mem_alloc `gc/sec` n_itr  n_gc total_time result          memory      time      gc       
#   <bch:expr>  <bch:tm> <bch:tm>     <dbl> <bch:byt>    <dbl> <int> <dbl>   <bch:tm> <list>          <list>      <list>    <list>   
# 1 forloop      272.4ms 284.86ms      3.51     656KB     7.02     2     4      570ms <df [318 x 11]> <Rprofmem ~ <bench_t~ <tibble ~
# 2 doublemerge    1.4ms   1.55ms    528.       346KB     1.99   265     1      502ms <df [318 x 11]> <Rprofmem ~ <bench_t~ <tibble ~

uj5u.com熱心網友回復:

單程data.table解決方案:

這可以在按Stand_ID, Tree_ID, then排序后一次性完成Plot_ID(在我的機器上大約 6 毫秒,包括讀取資料)。

首先,我將示例資料字串復制到 object data

library(data.table)

dt <- fread(input = data) # read into a data.table

setorder(dt[, `:=`(Plot_ID = as.integer(substr(Plot_ID, 2, 2)), DG = as.numeric(DG))], # convert Plot_ID to an integer and DG to numeric (from logical)
         # order by Stand_ID, Tree_ID, Plot_ID
         Stand_ID, Tree_ID, Plot_ID)[
          # create a temporary column indicating the rows that will pull DBH from the previous row
          , pull := c(FALSE, diff(Plot_ID) == 1L) & Stand_ID == shift(Stand_ID) & Tree_ID == shift(Tree_ID)][
          # pull DBH from the previous row where appropriate
          pull == TRUE, DG := shift(dt$DBH)[dt$pull]][,
          # clean up
          `:=`(pull = NULL, Plot_ID = paste0("R", Plot_ID))]

uj5u.com熱心網友回復:

我相信這可以用更少的代碼以更簡單的方式重新構建。看起來您正在對資料進行連接,其中查找鍵是當前 Plot_ID 的修改版本,其中“R#”應鏈接到“R#-1T”。

在 R 中執行此操作的一種更慣用的方法是為所有行創建一次適當的鍵,然后基于該查找鍵進行連接。這將比您的回圈方法快幾個數量級,因為它只需要編譯一次查找代碼而不是 650,000 次,并且連接針對速度進行了優化。請參閱此頁面以深入解釋為什么矢量化在 R 中如此有幫助:https ://www.noamross.net/archives/2014-04-16-vectorization-in-r-why/

我在下面使用 dplyr 執行此操作,但該方法在 base r 中的作業方式非常相似。

library(dplyr)
FVS_TreeInit %>%

  # create key for all rows
  mutate(prior_key = paste0(Stand_ID,  "R", 
    parse_number(Plot_ID)-1, "T",  # will be nonsense R-1T when starts from R0, that's ok,
    Tree_ID)) %>%                  # it just won't replace GD there

  # Use that key to join to a version of the data with just StandPlotTree_ID and
  # DBH, which I rename as GD. Match `prior_key` with `StandPlotTree_ID` there.
  left_join(FVS_TreeInit %>% transmute(StandPlotTree_ID, GD = DBH),
            by = c("prior_key" = "StandPlotTree_ID")) 

基準

您的原始代碼在提供的示例資料上運行需要 3.7 秒。我建議的更換耗時 0.027 秒,大約是 140 倍的更換速度。我預計隨著資料的增加,時差會變得更大。

轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/414689.html

標籤:

上一篇:在R中重新分類具有多個范圍的柵格

下一篇:在R中用ggplot2重疊許多圖

標籤雲
其他(157675) Python(38076) JavaScript(25376) Java(17977) C(15215) 區塊鏈(8255) C#(7972) AI(7469) 爪哇(7425) MySQL(7132) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5869) 数组(5741) R(5409) Linux(5327) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4554) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2429) ASP.NET(2402) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) 功能(1967) .NET技术(1958) Web開發(1951) python-3.x(1918) HtmlCss(1915) 弹簧靴(1913) C++(1909) xml(1889) PostgreSQL(1872) .NETCore(1853) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • 【C++】Microsoft C++、C 和匯編程式檔案

    ......

    uj5u.com 2020-09-10 00:57:23 more
  • 例外宣告

    相比于斷言適用于排除邏輯上不可能存在的狀態,例外通常是用于邏輯上可能發生的錯誤。 例外宣告 Item 1:當函式不可能拋出例外或不能接受拋出例外時,使用noexcept 理由 如果不打算拋出例外的話,程式就會認為無法處理這種錯誤,并且應當盡早終止,如此可以有效地阻止例外的傳播與擴散。 示例 //不可 ......

    uj5u.com 2020-09-10 00:57:27 more
  • Codeforces 1400E Clear the Multiset(貪心 + 分治)

    鏈接:https://codeforces.com/problemset/problem/1400/E 來源:Codeforces 思路:給你一個陣列,現在你可以進行兩種操作,操作1:將一段沒有 0 的區間進行減一的操作,操作2:將 i 位置上的元素歸零。最終問:將這個陣列的全部元素歸零后操作的最少 ......

    uj5u.com 2020-09-10 00:57:30 more
  • UVA11610 【Reverse Prime】

    本人看到此題沒有翻譯,就附帶了一個自己的翻譯版本 思考 這一題,它的第一個要求是找出所有 $7$ 位反向質數及其質因數的個數。 我們應該需要質數篩篩選1~$10^{7}$的所有數,這里就不慢慢介紹了。但是,重讀題,我們突然發現反向質數都是 $7$ 位,而將它反過來后的數字卻是 $6$ 位數,這就說明 ......

    uj5u.com 2020-09-10 00:57:36 more
  • 統計區間素數數量

    1 #pragma GCC optimize(2) 2 #include <bits/stdc++.h> 3 using namespace std; 4 bool isprime[1000000010]; 5 vector<int> prime; 6 inline int getlist(int ......

    uj5u.com 2020-09-10 00:57:47 more
  • C/C++編程筆記:C++中的 const 變數詳解,教你正確認識const用法

    1、C中的const 1、區域const變數存放在堆疊區中,會分配記憶體(也就是說可以通過地址間接修改變數的值)。測驗代碼如下: 運行結果: 2、全域const變數存放在只讀資料段(不能通過地址修改,會發生寫入錯誤), 默認為外部聯編,可以給其他源檔案使用(需要用extern關鍵字修飾) 運行結果: ......

    uj5u.com 2020-09-10 00:58:04 more
  • 【C++犯錯記錄】VS2019 MFC添加資源不懂如何修改資源宏ID

    1. 首先在資源視圖中,添加資源 2. 點擊新添加的資源,復制自動生成的ID 3. 在解決方案資源管理器中找到Resource.h檔案,編輯,使用整個專案搜索和替換的方式快速替換 宏宣告 4. Ctrl+Shift+F 全域搜索,點擊查找全部,然后逐個替換 5. 為什么使用搜索替換而不使用屬性視窗直 ......

    uj5u.com 2020-09-10 00:59:11 more
  • 【C++犯錯記錄】VS2019 MFC不懂的批量添加資源

    1. 打開資源頭檔案Resource.h,在其中預先定義好宏 ID(不清楚其實ID值應該設定多少,可以先新建一個相同的資源項,再在這個資源的ID值的基礎上遞增即可) 2. 在資源視圖中選中專案資源,按F7編輯資源檔案,按 ID 型別 相對路徑的形式添加 資源。(別忘了先把檔案拷貝到專案中的res檔案 ......

    uj5u.com 2020-09-10 01:00:19 more
  • C/C++編程筆記:關于C++的參考型別,專供新手入門使用

    今天要講的是C++中我最喜歡的一個用法——參考,也叫別名。 參考就是給一個變數名取一個變數名,方便我們間接地使用這個變數。我們可以給一個變數創建N個參考,這N + 1個變數共享了同一塊記憶體區域。(參考型別的變數會占用記憶體空間,占用的記憶體空間的大小和指標型別的大小是相同的。雖然參考是一個物件的別名,但 ......

    uj5u.com 2020-09-10 01:00:22 more
  • 【C/C++編程筆記】從頭開始學習C ++:初學者完整指南

    眾所周知,C ++的學習曲線陡峭,但是花時間學習這種語言將為您的職業帶來奇跡,并使您與其他開發人員區分開。您會更輕松地學習新語言,形成真正的解決問題的技能,并在編程的基礎上打下堅實的基礎。 C ++將幫助您養成良好的編程習慣(即清晰一致的編碼風格,在撰寫代碼時注釋代碼,并限制類內部的可見性),并且由 ......

    uj5u.com 2020-09-10 01:00:41 more
最新发布
  • Rust中的智能指標:Box<T> Rc<T> Arc<T> Cell<T> RefCell<T> Weak

    Rust中的智能指標是什么 智能指標(smart pointers)是一類資料結構,是擁有資料所有權和額外功能的指標。是指標的進一步發展 指標(pointer)是一個包含記憶體地址的變數的通用概念。這個地址參考,或 ” 指向”(points at)一些其 他資料 。參考以 & 符號為標志并借用了他們所 ......

    uj5u.com 2023-04-20 07:24:10 more
  • Java的值傳遞和參考傳遞

    值傳遞不會改變本身,參考傳遞(如果傳遞的值需要實體化到堆里)如果發生修改了會改變本身。 1.基本資料型別都是值傳遞 package com.example.basic; public class Test { public static void main(String[] args) { int ......

    uj5u.com 2023-04-20 07:24:04 more
  • [2]SpinalHDL教程——Scala簡單入門

    第一個 Scala 程式 shell里面輸入 $ scala scala> 1 + 1 res0: Int = 2 scala> println("Hello World!") Hello World! 檔案形式 object HelloWorld { /* 這是我的第一個 Scala 程式 * 以 ......

    uj5u.com 2023-04-20 07:23:58 more
  • 理解函式指標和回呼函式

    理解 函式指標 指向函式的指標。比如: 理解函式指標的偽代碼 void (*p)(int type, char *data); // 定義一個函式指標p void func(int type, char *data); // 宣告一個函式func p = func; // 將指標p指向函式func ......

    uj5u.com 2023-04-20 07:23:52 more
  • Django筆記二十五之資料庫函式之日期函式

    本文首發于公眾號:Hunter后端 原文鏈接:Django筆記二十五之資料庫函式之日期函式 日期函式主要介紹兩個大類,Extract() 和 Trunc() Extract() 函式作用是提取日期,比如我們可以提取一個日期欄位的年份,月份,日等資料 Trunc() 的作用則是截取,比如 2022-0 ......

    uj5u.com 2023-04-20 07:23:45 more
  • 一天吃透JVM面試八股文

    什么是JVM? JVM,全稱Java Virtual Machine(Java虛擬機),是通過在實際的計算機上仿真模擬各種計算機功能來實作的。由一套位元組碼指令集、一組暫存器、一個堆疊、一個垃圾回收堆和一個存盤方法域等組成。JVM屏蔽了與作業系統平臺相關的資訊,使得Java程式只需要生成在Java虛擬機 ......

    uj5u.com 2023-04-20 07:23:31 more
  • 使用Java接入小程式訂閱訊息!

    更新完微信服務號的模板訊息之后,我又趕緊把微信小程式的訂閱訊息給實作了!之前我一直以為微信小程式也是要企業才能申請,沒想到小程式個人就能申請。 訊息推送平臺🔥推送下發【郵件】【短信】【微信服務號】【微信小程式】【企業微信】【釘釘】等訊息型別。 https://gitee.com/zhongfuch ......

    uj5u.com 2023-04-20 07:22:59 more
  • java -- 緩沖流、轉換流、序列化流

    緩沖流 緩沖流, 也叫高效流, 按照資料型別分類: 位元組緩沖流:BufferedInputStream,BufferedOutputStream 字符緩沖流:BufferedReader,BufferedWriter 緩沖流的基本原理,是在創建流物件時,會創建一個內置的默認大小的緩沖區陣列,通過緩沖 ......

    uj5u.com 2023-04-20 07:22:49 more
  • Java-SpringBoot-Range請求頭設定實作視頻分段傳輸

    老實說,人太懶了,現在基本都不喜歡寫筆記了,但是網上有關Range請求頭的文章都太水了 下面是抄的一段StackOverflow的代碼...自己大修改過的,寫的注釋挺全的,應該直接看得懂,就不解釋了 寫的不好...只是希望能給視頻網站開發的新手一點點幫助吧. 業務場景:視頻分段傳輸、視頻多段傳輸(理 ......

    uj5u.com 2023-04-20 07:22:42 more
  • Windows 10開發教程_編程入門自學教程_菜鳥教程-免費教程分享

    教程簡介 Windows 10開發入門教程 - 從簡單的步驟了解Windows 10開發,從基本到高級概念,包括簡介,UWP,第一個應用程式,商店,XAML控制元件,資料系結,XAML性能,自適應設計,自適應UI,自適應代碼,檔案管理,SQLite資料庫,應用程式到應用程式通信,應用程式本地化,應用程式 ......

    uj5u.com 2023-04-20 07:22:35 more