如何从冲突年龄组计算动物个体的最小数值年龄?
解决方案
要计算每个观测个体的最小数值年龄,核心逻辑是基于个体首次捕获的年龄基准,结合后续年份与首次年份的差值推导(每年年龄增长1岁)。以下是修正后的完整代码:
library(dplyr) # 先确保Year为整数类型(避免字符型计算错误) Data <- Data %>% mutate(Year = as.integer(Year)) # 按个体ID分组计算最小数值年龄 Data <- Data %>% group_by(ID) %>% mutate( # 确定个体首次捕获的最小基准年龄 base_age = case_when( first(Age_Class) == "1CY" ~ 0, first(Age_Class) == "2CY" ~ 1, first(Age_Class) == ">1CY" ~ 1, first(Age_Class) == ">2CY" ~ 2 ), # 计算当前观测的最小数值年龄:基准年龄 + 年份差 Age_Numeric = base_age + (Year - first(Year)) ) %>% select(-base_age) %>% # 移除中间计算变量 ungroup() # 查看结果 print(Data)
代码说明
- 基准年龄映射:根据个体首次被捕获的年龄组,确定其最小可能的初始年龄:
1CY→ 0岁,2CY→ 1岁,>1CY→ 1岁,>2CY→ 2岁
- 年龄推导:每个后续观测的年龄 = 首次基准年龄 + (当前年份 - 首次捕获年份),因为每年个体年龄必然增长1岁,这样得到的就是该观测下的最小数值年龄
- 通用性:该逻辑统一处理所有年龄组,无需单独针对
>1CY或>2CY写分支,解决了原代码的局限性
验证结果
运行上述代码后,得到的Age_Numeric列将完全匹配你期望的输出:
ID Age_Class Year Age_Numeric 1 A 1CY 2010 0 2 B 2CY 2010 1 3 A >1CY 2011 1 4 B >2CY 2011 2 5 C >2CY 2011 2 6 A >1CY 2012 2 7 B >1CY 2012 3 8 A >2CY 2013 3 9 B >2CY 2013 4 10 C >1CY 2013 4
内容的提问来源于stack exchange,提问作者Michiel Lathouwers
相关产品推荐
相关产品推荐

