如何按月份计算数据框中空腹鱼占比及猎物存在/缺失比例?
鱼类胃内容物数据统计解决方案
问题背景
我有鱼类胃内容物(猎物)数据:原始为长格式(每条鱼对应唯一FID,每行代表一种检出的猎物类群),已转换为宽格式(每行对应一条鱼)。需要完成:
- 按月份计算空腹鱼占比(即
totalnumPrey == 0的个体占比) - 计算每种猎物类群的存在/缺失占比(比如含Isopod的鱼类占比)
后续还需支持其他分组维度的统计。
之前尝试的代码报错:
example %>% group_by(empty, MONTH) %>% summarise(totalnumPrey = n()) %>% mutate(prop = n / sum(n))
错误信息:
Error in `mutate()`: ! Problem while computing `prop = n/sum(n)`. ℹ The error occurred in group 1: empty = "Empty". Caused by error in `sum()`: ! invalid 'type' (closure) of argument
错误原因
- 变量名错误:
summarise中把计数结果命名为totalnumPrey,但后续mutate里误用了不存在的变量n - 分组逻辑错误:计算每月空腹占比应按
MONTH分组,而非同时按empty和MONTH分组,否则无法在组内计算占比。
解决方案
1. 按月份计算空腹鱼占比
基于宽格式数据(每行对应一条鱼),两种实现方式:
# 方式1:直接统计总数与空腹数 empty_monthly_prop <- example %>% group_by(MONTH) %>% summarise( total_fish = n(), empty_fish = sum(totalnumPrey == 0), empty_proportion = empty_fish / total_fish ) # 方式2:用count简化流程 empty_monthly_prop <- example %>% mutate(is_empty = totalnumPrey == 0) %>% count(MONTH, is_empty) %>% group_by(MONTH) %>% mutate(proportion = n / sum(n)) %>% filter(is_empty) %>% select(MONTH, empty_proportion = proportion)
2. 计算每种猎物类群的存在占比
假设宽格式数据中,猎物类群为二进制列(1=存在,0=不存在),用across批量处理所有猎物列:
# 按月份统计所有猎物类群的存在占比 prey_monthly_prop <- example %>% group_by(MONTH) %>% summarise( total_fish = n(), # 替换为你的猎物列范围,比如Isopod:Copepod,或matches("prey_")匹配列名 across(Isopod:Copepod, ~ sum(.x == 1) / total_fish, .names = "{.col}_prop") ) # 支持多维度分组(比如加物种、区域) prey_multi_prop <- example %>% group_by(MONTH, Species, Region) %>% summarise( total_fish = n(), across(Isopod:Copepod, ~ sum(.x == 1) / total_fish, .names = "{.col}_prop") )
补充处理
如果猎物列是计数型(记录该猎物的数量),需先转换为存在/缺失的二进制值:
example <- example %>% mutate(across(Isopod:Copepod, ~ as.integer(.x > 0)))
内容的提问来源于stack exchange,提问作者FishyFishies
相关产品推荐
相关产品推荐

