在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
相关产品推荐
相关产品推荐

