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)
关键说明
- 性别比定义:这里采用「雄性后代数量 / 总后代数量」的计算方式,若需要其他定义(如雄性/雌性),只需修改
sex_ratio的计算式(例如sex_ratio = male_count / female_count,注意处理雌性后代为0的情况)。 - 母本物种匹配:通过
first(df$Species[df$AnonID == DamAnonID])获取母本的物种,因为每个母本的AnonID对应唯一物种,用first()取第一个匹配值即可。 - 过滤无效母本:
filter(!is.na(species))排除了未出现在数据集中的母本(如示例中的DamAnonID=0),若需要保留这些母本,可直接删除该行。
内容的提问来源于stack exchange,提问作者JMac
相关产品推荐
相关产品推荐

