簡體   English   中英

使用 for 循環計算攝入量

[英]Calculating intake rate with a for loop

我正在嘗試為一個大型數據集計算幾個物種的攝入率,但我一直在遇到錯誤。 我希望能夠搜索特定物種的數據集,然后根據數據集中找到的密度數據計算新列中的攝入率,然后將其應用於用戶定義的方程和常數列表。 運行我編寫的代碼時,我收到錯誤: Error in if (bd$Density[i] < max) {: missing value where TRUE/FALSE needed In addition: Warning message: In Ops.factor(bd$Density[i], max): '<' not meaningful for factors我不確定這是否是實現目標的最佳方式,但這是我目前所擁有的:

  bd<-biomass_data[,7:9]
> bd<-sample_n(bd,30)
> bd<-as.matrix(bd)
> dput(bd)
structure(c("Scirpus robustus?", "Scirpus genus 1", "Zannichallia palustris", 
"Hydrobia", "Scirpus subterminalis", "Scirpus genus 1", "Scirpus americanus", 
"Scirpus genus 2", "Scirpus validus", "Scirpus genus", "Scirpus genus", 
"Scirpus heterochaetus", "Scirpus heterochaetus", "Scirpus olney?", 
"Scirpus subterminalis", "Zannichallia palustris", "Spartina pectinata", 
"Melampus bidentatus", "Melampus bidentatus", "Spartina genus", 
"Scirpus validus", "Scirpus americanus", "Hydrobia spp", "Scirpus robustus", 
"Scirpus genus 3", "Zannichallia palustris", "Spartina genus?", 
"Scirpus americanus", "Scirpus olneyi", "Scirpus genus 3", "0.001426029", 
"0.000519737", "5.72E-05", "3.57E-06", "2.44E-05", "0.002040368", 
"0.000558061", "0.020121403", "0.00034925", "1.87E-05", "1.12E-05", 
"6.98E-05", "0.000524448", "0.000963843", "3.63E-05", "2.16E-06", 
"3.31E-06", "0.000127069", "0.004839333", "0.000101477", "4.84E-06", 
"9.03E-05", "1.03E-05", "9.33E-05", "3.69E-05", "7.17E-05", "0.000152916", 
"9.52E-05", "0.01200946", "1.20E-05", "Scirpus", "Scirpus", "Zannichellia", 
"Melampus", "Scirpus", "Scirpus", "Scirpus", "Scirpus", "Scirpus", 
"Scirpus", "Scirpus", "Scirpus", "Scirpus", "Scirpus", "Scirpus", 
"Zannichellia", "Scirpus", "Melampus", "Melampus", "Scirpus", 
"Scirpus", "Scirpus", "Melampus", "Scirpus", "Scirpus", "Zannichellia", 
"Scirpus", "Scirpus", "Scirpus", "Scirpus"), .Dim = c(30L, 3L
), .Dimnames = list(NULL, c("Prey", "Density", "Prey.Group")))


f2<-function(x,a,b){return((a*x)/(b+x))}
f3<-function(x,a,b){return((a*x)^2/(b^2+x^2))}

for(i in 1:nrow(bd)){
  if(bd$Prey.Group[i]=="Melampus"){
    #mytype = 2
    a=0.01025
    b=3.76698
    max = 6
    imax =0.007
    if(bd$Density[i]<max){
      bd$intakerate[i] = f2(bd$Density[i],a,b)
    }
    else{
      bd$intakerate[i] = imax
    }
  }
  else if(bd$Prey.Group[i]=="Zannichellia"){
    #mytype = 2
    a=1.489
    b=701.753
    max = 1600
    imax = 1
    if(bd$Density[i]<max){
      bd$intakerate[i] = f2(bd$Density[i],a,b)
    }
    else{
      bd$intakerate[i] = imax
    }
  }
  else if(bd$Prey.Group[i]=="Scirpus"){
    #mytype = 3
    a=0.1644
    b=-10.9602
    max = 40
    imax = 0.03
    if(bd$Density[i]<max){
      bd$intakerate[i] = f3(bd$Density[i],a,b)
    }
    else{
      bd$intakerate[i] = imax
    }
  }
  else if(bd$Prey.Group[i]=="Ruppia"){
    #mytype = 2
    a=1.1318
    b=434.9
    max=1500
    imax = 1.4
    if(bd$Density[i]<max){
      bd$intakerate[i] =  f2(bd$Density[i],a,b)
    }
    else{
      bd$intakerate[i] = imax
    }
  }
}

代碼:

library('data.table')
# create constant table for each species. I did for only two species, but you can do the same for all species.
spec_const <- data.frame(Prey.Group = c('Melampus',"Zannichellia"),
                         a = c(0.01025, 1.489),
                         b = c(3.76698, 701.753),
                         max = c(6, 1600),
                         imax = c(0.007, 1),
                         fun = c(2, 3),
                         stringsAsFactors = FALSE)

# convert bd to data table
bd <- as.data.table(bd)
# convert spec_const to data table
setDT(spec_const)
# tidy data: Density from character to numeric
bd[, Density := as.numeric(Density)]
# assign imax value to intake_rate for each of their Prey.Group
bd[spec_const, on = "Prey.Group", intake_rate := imax ]
# apply functions 2 and 3 based on the join results of bd and spec_const
# rbind them together
rbindlist(l = list(bd[spec_const[fun == 2,], on = "Prey.Group" ][Density < max, intake_rate := f2(Density, a, b) ][],
                   bd[spec_const[fun == 3,], on = "Prey.Group" ][Density < max, intake_rate := f3(Density, a, b) ][]))

#                      Prey     Density   Prey.Group  intake_rate       a         b  max  imax fun
# 1:               Hydrobia 0.000003570     Melampus 9.714006e-09 0.01025   3.76698    6 0.007   2
# 2:    Melampus bidentatus 0.000127069     Melampus 3.457447e-07 0.01025   3.76698    6 0.007   2
# 3:    Melampus bidentatus 0.004839333     Melampus 1.315099e-05 0.01025   3.76698    6 0.007   2
# 4:           Hydrobia spp 0.000010300     Melampus 2.802635e-08 0.01025   3.76698    6 0.007   2
# 5: Zannichallia palustris 0.000057200 Zannichellia 1.473034e-14 1.48900 701.75300 1600 1.000   3
# 6: Zannichallia palustris 0.000002160 Zannichellia 2.100527e-17 1.48900 701.75300 1600 1.000   3
# 7: Zannichallia palustris 0.000071700 Zannichellia 2.314510e-14 1.48900 701.75300 1600 1.000   3

暫無
暫無

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

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