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

R语言分组数据分类变量统计:计算物种母本性别比中位数

如何用dplyr按母本统计后代雌雄数量并计算物种的母本性别比中位数

解决方案

使用dplyr的管道操作可以高效完成所有需求,从统计母本后代雌雄数,到计算性别比,再到最终得到各物种的性别比中位数,全程无需拆分多个数据框。

完整代码

library(dplyr)

# 示例数据集
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)
)

# 一步完成所有计算
result <- df %>%
  # 按母本分组,统计雌雄后代数并计算性别比
  group_by(DamAnonID) %>%
  summarise(
    male_count = sum(Sex == "M"),
    female_count = sum(Sex == "F"),
    total_offspring = n(),
    sex_ratio = male_count / total_offspring,
    # 匹配母本的物种信息(母本AnonID等于后代的DamAnonID)
    species = first(df$Species[df$AnonID == DamAnonID])
  ) %>%
  # 过滤掉不在数据集中的母本(比如DamAnonID=0)
  filter(!is.na(species)) %>%
  # 按物种分组计算性别比中位数
  group_by(species) %>%
  summarise(MedianSexRatio = round(median(sex_ratio), 2)) %>%
  # 调整列名并按物种排序
  rename(Species = species) %>%
  arrange(Species)

# 输出结果
print(result)

输出结果

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

单独完成第一步:按母本统计雌雄数量

如果只需要统计每个母本的雌雄后代数量,提取以下代码即可:

dam_sex_summary <- df %>%
  group_by(DamAnonID) %>%
  summarise(
    male_offspring = sum(Sex == "M"),
    female_offspring = sum(Sex == "F"),
    total_offspring = n()
  )

print(dam_sex_summary)

关键说明

  1. 性别比定义:这里采用「雄性后代数量 / 总后代数量」的计算方式,若需要其他定义(如雄性/雌性),只需修改sex_ratio的计算式(例如sex_ratio = male_count / female_count,注意处理雌性后代为0的情况)。
  2. 母本物种匹配:通过first(df$Species[df$AnonID == DamAnonID])获取母本的物种,因为每个母本的AnonID对应唯一物种,用first()取第一个匹配值即可。
  3. 过滤无效母本:filter(!is.na(species))排除了未出现在数据集中的母本(如示例中的DamAnonID=0),若需要保留这些母本,可直接删除该行。

内容的提问来源于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 19:25:31