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

如何计算猎物物种在单个捕食者中的出现百分比(R语言)

计算猎物在捕食者个体中的出现百分比(R语言)

样本数据集

Species <- c("Bass", "Bass", "Bass", "Bass", "Bass", "Bass", "Bass", "Bass", "Bass")
FishID <- c("a1", "a1", "a1", "a2", "a2", "a3", "a3", "a3", "a3")
Prey <- c("Amphipoden", "Mysis", "Polychaeten", "Amphipoden", "Mysis", "Amphipoden", "Mysis", "Polychaeten", "Mollusca")

df <- data.frame(Species, FishID, Prey)

需求说明

现有捕食者Bass共3个唯一个体(FishID:a1、a2、a3),需计算每种猎物出现在多少个Bass个体的胃中,占总Bass个体数的比例。

预期结果

最终需得到如下格式的数据集:

Species <- c("Bass", "Bass", "Bass", "Bass")
Prey <- c("Amphipoden", "Mysis", "Polychaeten", "Mollusca")
Percentage <- c(100, 100, 66.6, 33.3)
df2 <- data.frame(Species, Prey, Percentage)

尝试的错误代码

以下代码无法得到预期结果,原因是它统计的是每种猎物的总出现次数占所有猎物总次数的比例,而非基于个体数的占比:

df %>%
  group_by(Species, Prey) %>% 
  summarise(n = n()) %>%
  mutate(percent = n / sum(n) * 100)

正确解决方法

核心思路是:先对每个个体的每种猎物去重(同一个体多次吃同一种猎物仅记一次出现),再统计每种猎物对应的个体数量,最后除以总个体数计算百分比:

library(dplyr)

# 获取Bass总个体数
total_individuals <- df %>% distinct(FishID) %>% nrow()

# 计算猎物的个体出现占比
df2 <- df %>%
  distinct(Species, FishID, Prey) %>%  # 去重:每个个体的每种猎物仅保留一条记录
  group_by(Species, Prey) %>%
  summarise(individual_count = n(), .groups = "drop") %>%  # 统计每种猎物对应的个体数
  mutate(Percentage = round(individual_count / total_individuals * 100, 1)) %>%  # 计算百分比并保留1位小数
  select(Species, Prey, Percentage)  # 选择需要的列

# 查看结果
df2

运行后输出结果与预期一致:

Species        Prey Percentage
1    Bass  Amphipoden      100.0
2    Bass    Mollusca       33.3
3    Bass       Mysis      100.0
4    Bass Polychaeten       66.7

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.16 02:13:14