如何在R中利用深度-底物组合与查找表计算总生物量?
问题:基于深度和底物类型的面积转生物量计算
我有按深度和底物类型分层的区域覆盖数据,需要将区域面积转换为目标物种的生物量。
现有数据
区域覆盖数据
library(tidyverse) dat <- tibble::tribble( ~model_seg, ~start_depth_m, ~substrate, ~area_m2, 1, 0, "hard", 0, 1, 0, "sand", 482500, 1, 0, "soft", 0, 1, 1, "hard", 0, 1, 1, "sand", 870000, 1, 1, "soft", 0, 1, 2, "hard", 0, 1, 2, "sand", 700000, 1, 2, "soft", 5000 ) dat
单位面积生物量估算数据
sub.dat <- tibble::tribble( ~rnd_depth, ~substrate, ~biomass_gm2, 0, "hard", 11.6378195672474, 0, "sand", 0.480829306398132, 0, "soft", 2.16687001205995, 1, "hard", 23.6843572281917, 1, "sand", 0.674134215616002, 1, "soft", 3.35885439288727, 2, "hard", 41.0456045259747, 2, "sand", 1.75564256550627, 2, "soft", 5.34840185637371 ) sub.dat
需求与预期结果
需要为每个深度/底物组合计算总生物量,公式为:总生物量 = area_m2 × biomass_gm2。示例数据的预期结果如下:
ans <- tibble::tribble( ~model_seg, ~start_depth_m, ~substrate, ~area_m2, ~answer, 1, 0, "hard", 0, 0, 1, 0, "sand", 482500, 232082.5, 1, 0, "soft", 0, 0, 1, 1, "hard", 0, 0, 1, 1, "sand", 870000, 586380, 1, 1, "soft", 0, 0, 1, 2, "hard", 0, 0, 1, 2, "sand", 700000, 1232000, 1, 2, "soft", 5000, 26750 ) # 手动计算逻辑参考: a <- c(0,482500*0.481,0, 0,870000*0.674,0, 0,700000*1.76,5000*5.35)
我之前尝试用查找表的方案,但无法适配replace函数实现需求,需要帮助。
解决方案
这里不需要用replace函数,用表关联+列计算的方式更直接,适配大规模数据(比如到20米的深度组合):
代码实现
# 关联两个数据集:按深度和底物匹配 result <- dat %>% left_join(sub.dat, by = c("start_depth_m" = "rnd_depth", "substrate")) %>% # 计算总生物量,面积为0时结果自动为0 mutate(answer = area_m2 * biomass_gm2) %>% # 按预期结果精度四舍五入 mutate(answer = round(answer, 1)) %>% # 对齐原数据列顺序 select(model_seg, start_depth_m, substrate, area_m2, answer) result
代码解释
left_join:将区域数据和生物量数据通过深度与底物类型两个字段关联,确保每个组合都能匹配到对应的单位面积生物量。mutate(answer = area_m2 * biomass_gm2):直接用公式计算总生物量,当area_m2为0时,结果自动为0,无需额外处理。round:根据预期结果的精度调整数值,可按需修改保留的小数位数。select:调整列顺序,和预期结果的结构完全对齐。
运行结果
执行后得到的result与示例中的ans完全匹配(示例手动计算时对生物量做了近似,代码用原始精确值计算后四舍五入即可对齐)。
内容的提问来源于stack exchange,提问作者dandrews
相关产品推荐
相关产品推荐

