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

在R中按CRN分组计算缺氧层厚度并创建新列

按站点计算缺氧层厚度的解决方案

假设你的数据框包含CRN(站点标识)、Depth(深度)和ODO_mgL(溶解氧浓度)三列,以下是用dplyr实现需求的代码:

核心代码(保留原始行)

library(dplyr)

# 处理数据,为每行添加缺氧层厚度列
df_processed <- df %>%
  group_by(CRN) %>%
  # 计算每个站点的最大深度
  mutate(max_depth = max(Depth, na.rm = TRUE)) %>%
  # 判断站点是否存在缺氧情况,并确定缺氧起始深度
  mutate(
    has_hypoxia = any(ODO_mgL < 2.0, na.rm = TRUE),
    hypoxia_start_depth = ifelse(has_hypoxia, min(Depth[ODO_mgL < 2.0], na.rm = TRUE), NA)
  ) %>%
  # 计算缺氧层厚度:无缺氧则为0,否则用最大深度减缺氧起始深度
  mutate(hypoxia_thickness = ifelse(has_hypoxia, max_depth - hypoxia_start_depth, 0)) %>%
  ungroup()

核心代码(站点汇总结果)

如果只需要每个站点的一行汇总数据,可改用summarize:

df_summary <- df %>%
  group_by(CRN) %>%
  summarize(
    max_depth = max(Depth, na.rm = TRUE),
    has_hypoxia = any(ODO_mgL < 2.0, na.rm = TRUE),
    hypoxia_start_depth = ifelse(has_hypoxia, min(Depth[ODO_mgL < 2.0], na.rm = TRUE), NA),
    hypoxia_thickness = ifelse(has_hypoxia, max_depth - hypoxia_start_depth, 0)
  ) %>%
  ungroup()

代码解释

  • group_by(CRN):按站点分组,确保所有计算都基于单个站点的数据集。
  • max(Depth, na.rm = TRUE):计算每个站点的最大水深,na.rm=TRUE用于忽略深度列的NA值。
  • any(ODO_mgL < 2.0, na.rm = TRUE):检查站点是否存在溶解氧低于2.0mg/L的缺氧记录,只要有一条满足就返回TRUE。
  • min(Depth[ODO_mgL < 2.0], na.rm = TRUE):提取站点中所有缺氧记录里的最浅深度(即缺氧层的起始深度)。
  • hypoxia_thickness:根据缺氧情况计算厚度,无缺氧时直接设为0,缺氧时用最大深度减去起始深度得到缺氧层的垂直厚度。

示例测试

用以下示例数据验证代码效果:

# 构造示例数据
df <- tibble(
  CRN = c("A", "A", "A", "B", "B", "B", "C", "C"),
  Depth = c(1, 3, 5, 2, 4, 6, 1, 3),
  ODO_mgL = c(3.2, 1.8, 1.2, 2.5, 2.1, 1.9, 3.0, 2.8)
)

运行核心代码后,站点A的缺氧起始深度为3,最大深度为5,厚度为2;站点B仅最深层缺氧,厚度为0;站点C无缺氧,厚度为0,符合预期。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.19 06:35:30