[英]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.