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

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.31 00:09:23