如何在R语言中根据年龄组计算个体的最小数值年龄
计算动物个体不同年份的最小数值年龄
我有一份多年的动物捕获数据集,数据定义及预览如下:
Data <- cbind.data.frame(c("A","B","C","A","C","D","B","C","D"), c("Juvenile","Adult","Adult","Adult","Adult","Juvenile","Adult","Adult","Adult"), c(2010,2010,2010,2011,2011,2011,2012,2012,2012)) colnames(Data) <- c("ID","Age_Class","Year")
数据预览:
> Data ID Age_Class Year 1 A Juvenile 2010 2 B Adult 2010 3 C Adult 2010 4 A Adult 2011 5 C Adult 2011 6 D Juvenile 2011 7 B Adult 2012 8 C Adult 2012 9 D Adult 2012
已知规则:标记为Juvenile的个体年龄为2岁,Adult的个体年龄至少为3岁。需要计算每个个体在不同年份的最小数值年龄,期望输出如下:
> Data ID Age_Class Year Age_Numeric 1 A Juvenile 2010 2 2 B Adult 2010 3 3 C Adult 2010 3 4 A Adult 2011 3 5 C Adult 2011 4 6 D Juvenile 2011 2 7 B Adult 2012 5 8 C Adult 2012 5 9 D Adult 2012 3
解决方案
方法1:Base R实现
通过分组计算个体首次捕获的基准年龄,再根据年份差推导后续年龄:
Data$Age_Numeric <- with(Data, ave(Year, ID, FUN = function(y) { sub_data <- Data[Data$ID == unique(ID), ] base_age <- ifelse(sub_data$Age_Class[which.min(sub_data$Year)] == "Juvenile", 2, 3) base_age + (y - min(sub_data$Year)) })) # 查看结果 print(Data)
方法2:dplyr包实现
使用tidyverse语法更简洁:
library(dplyr) Data <- Data %>% group_by(ID) %>% mutate( first_year = min(Year), base_age = ifelse(Age_Class[Year == first_year] == "Juvenile", 2, 3), Age_Numeric = base_age + (Year - first_year) ) %>% ungroup() %>% select(-first_year, -base_age) # 查看结果 print(Data)
内容的提问来源于stack exchange,提问作者Michiel Lathouwers
相关产品推荐
相关产品推荐

