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

使用R的dplyr包汇总河流栖息地非数值底物变量占比的问题

河流物理栖息地数据集多维度汇总实现方案

核心实现逻辑

  • 按Location、Reach、Transect三个字段进行分组
  • 流量、深度等数值变量直接计算分组均值
  • 底物分类变量通过统计指定类别在组内的出现次数,除以组内总样本量得到占比

代码实现

固定底物类别写法(适合已知所有底物类别的场景)

library(tidyverse)

# 替换river_habitat为你的实际数据集名
habitat_summary <- river_habitat %>%
  group_by(Location, Reach, Transect) %>%
  summarize(
    平均流量 = mean(流量, na.rm = TRUE),
    平均深度 = mean(深度, na.rm = TRUE),
    CO占比 = sum(Substrate == "CO", na.rm = TRUE) / n(),
    GR占比 = sum(Substrate == "GR", na.rm = TRUE) / n(),
    SA占比 = sum(Substrate == "SA", na.rm = TRUE) / n(),
    SILT占比 = sum(Substrate == "SILT", na.rm = TRUE) / n(),
    BO占比 = sum(Substrate == "BO", na.rm = TRUE) / n(),
    .groups = "drop"
  )

自适应底物类别写法(适合底物类别不固定的场景)

如果你需要自动适配所有存在的底物类别,不需要手动逐个写判断条件,可以结合pivot_wider实现:

habitat_summary <- river_habitat %>%
  # 先计算各分组的数值变量均值
  group_by(Location, Reach, Transect) %>%
  mutate(
    平均流量 = mean(流量, na.rm = TRUE),
    平均深度 = mean(深度, na.rm = TRUE)
  ) %>%
  # 统计各分组下各底物的出现频次
  group_by(Location, Reach, Transect, 平均流量, 平均深度, Substrate) %>%
  count(name = "type_count") %>%
  # 计算各类底物占比
  group_by(Location, Reach, Transect) %>%
  mutate(占比 = type_count / sum(type_count)) %>%
  # 长表转宽表生成各底物占比列
  pivot_wider(
    id_cols = c(Location, Reach, Transect, 平均流量, 平均深度),
    names_from = Substrate,
    names_suffix = "占比",
    values_from = 占比,
    values_fill = 0
  )

values_fill = 0参数的作用是:如果某个样带内没有出现对应底物类型,自动将该类底物的占比填充为0,避免生成缺失值。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.27 20:24:04