使用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
相关产品推荐
相关产品推荐

