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

在R中计算大型动物数据集各物种的中位数性别比率

问题:计算动物数据集各物种的中位数性别比率

我正在处理一个约50万条记录的动物数据集,包含个体ID(AnonID)、物种、性别及母兽ID(DamAnonID),需计算各物种的中位数性别比率。

示例数据集:

df <- data.frame(
  AnonID = c(1,2,3,4,5,6,7,8,9,10),
  Species = c("A","A", "A","B","C","C","A","C","B","C"),
  Sex = c("F","F","M","F","M","F","F","F","M","M"),
  DamAnonID = c(0,1,1,2,2,2,4,4,4,6)
)

目标结果:

Species <- c("A", "B", "C")
MedianSexRatio <- c(.33,.33,1)

我的计划步骤:

  • 统计每只母兽的雌雄后代数量
  • 计算每只母兽的性别比率(雄性数量/总后代数)
  • 计算各物种的中位数性别比率

但卡在第一步:用dplyr的group_by(DamAnonID, Sex)后用tally()统计,会得到每个DamAnonID对应两行(雌雄各一行),我需要每个DamAnonID对应一行,包含雌雄后代数量两列。恳请提供计算母兽性别比率的方法,或直接计算各物种中位数性别比率的方案!


解决方案

可以用dplyr结合tidyr的工具完成整个流程,以下是分步实现的完整代码:

完整代码

library(dplyr)
library(tidyr)

# 1. 统计每只母兽的雌雄后代数量(转成宽表)
dam_offspring <- df %>%
  # 排除无母兽的个体(DamAnonID=0)
  filter(DamAnonID != 0) %>%
  # 按母兽ID和物种分组,统计性别数量
  group_by(DamAnonID, Species) %>%
  count(Sex, name = "num_offspring") %>%
  # 转宽表:将性别转为列,缺失的性别用0填充
  pivot_wider(names_from = Sex, values_from = num_offspring, values_fill = 0) %>%
  ungroup()

# 2. 计算每只母兽的性别比率
dam_ratio <- dam_offspring %>%
  mutate(
    total_offspring = F + M,
    sex_ratio = M / total_offspring
  )

# 3. 计算各物种的中位数性别比率
species_median <- dam_ratio %>%
  group_by(Species) %>%
  summarize(MedianSexRatio = round(median(sex_ratio), 2)) %>%
  ungroup()

# 输出结果
print(species_median)

关键步骤说明

  • 转宽表:使用pivot_wider将分组统计后的长表(每个母兽+性别一行)转为宽表(每个母兽一行,F、M列分别对应雌雄后代数),values_fill=0避免因母兽只有单一性别后代出现NA值。
  • 性别比率计算:通过F + M得到总后代数,再用雄性数量除以总数得到比率。
  • 中位数计算:按物种分组后调用median函数,用round保留两位小数匹配示例结果。

运行结果

# A tibble: 3 × 2
  Species MedianSexRatio
  <chr>            <dbl>
1 A                 0.33
2 B                 0.33
3 C                 1   

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.29 20:05:43