You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

代码解释

  1. left_join:将区域数据和生物量数据通过深度与底物类型两个字段关联,确保每个组合都能匹配到对应的单位面积生物量。
  2. mutate(answer = area_m2 * biomass_gm2):直接用公式计算总生物量,当area_m2为0时,结果自动为0,无需额外处理。
  3. round:根据预期结果的精度调整数值,可按需修改保留的小数位数。
  4. select:调整列顺序,和预期结果的结构完全对齐。

运行结果

执行后得到的result与示例中的ans完全匹配(示例手动计算时对生物量做了近似,代码用原始精确值计算后四舍五入即可对齐)。


内容的提问来源于stack exchange,提问作者dandrews

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.06 05:45:25