用 R 中的观察数据补充年龄 class 的确定

Supplementing age class determination with observation data in R

我正在处理这样结构的年度观察数据集

data<-data.frame(ID=c(rep("A",6),rep("B",12),rep("C",9)),
             FeatherID=rep(c("a","b","c"),9),
             Year=c(rep(2020,3),rep(2021,3),rep(2017,3),rep(2019,3),rep(2020,3),rep(2021,3),rep(2018,3),rep(2019,3),rep(2020,3)),
             Age_Field=c(rep("1CY",3),rep("2CY",3),rep("1CY",3),rep(">2CY",3),rep(">2CY",3),rep(">2CY",3),rep(">2CY",3),rep(">2CY",3),rep(">2CY",3)))
   ID FeatherID Year Age_Field
1   A         a 2020       1CY
2   A         b 2020       1CY
3   A         c 2020       1CY
4   A         a 2021       2CY
5   A         b 2021       2CY
6   A         c 2021       2CY
7   B         a 2017       1CY
8   B         b 2017       1CY
9   B         c 2017       1CY
10  B         a 2019      >2CY
11  B         b 2019      >2CY
12  B         c 2019      >2CY
13  B         a 2020      >2CY
14  B         b 2020      >2CY
15  B         c 2020      >2CY
16  B         a 2021      >2CY
17  B         b 2021      >2CY
18  B         c 2021      >2CY
19  C         a 2018      >2CY
20  C         b 2018      >2CY
21  C         c 2018      >2CY
22  C         a 2019      >2CY
23  C         b 2019      >2CY
24  C         c 2019      >2CY
25  C         a 2020      >2CY
26  C         b 2020      >2CY
27  C         c 2020      >2CY

对于每个年度观察,个体的年龄 class 被确定为第一年 (1CY)、第二年 (2CY) 或更大 (>2CY)。我想将这个年龄 class 数据与观察个体的年份给出的信息结合起来,以便计算出每一年每个人的真实(最小)年龄的列,对应于前面的例子

 > data.frame(Age_True=c(rep(0,3),rep(1,3),rep(0,3),rep(2,3),rep(3,3),rep(4,3),rep(2,3),rep(3,3),rep(4,3)))
   Age_True
1         0
2         0
3         0
4         1
5         1
6         1
7         0
8         0
9         0
10        2
11        2
12        2
13        3
14        3
15        3
16        4
17        4
18        4
19        2
20        2
21        2
22        3
23        3
24        3
25        4
26        4
27        4

我一直在尝试不同的方法来做到这一点,但我不太明白。希望有人知道这样做的方法。干杯!

这可能有点老套,但效果很好。首先,用readr::parse_numberAge_Field列转换为1、2、3值。然后用简单的算法计算年龄。

library(reader)
library(dplyr)
data %>% 
  group_by(ID, Age_Field) %>% 
  mutate(Age = ifelse(nchar(Age_Field) == 4, parse_number(Age_Field) + 1, parse_number(Age_Field)),
         Age = Year - Year[first(Age)] + Age - 1)

输出

# A tibble: 27 x 5
# Groups:   ID, Age_Field [5]
   ID    FeatherID  Year Age_Field   Age
   <chr> <chr>     <dbl> <chr>     <dbl>
 1 A     a          2020 1CY           0
 2 A     b          2020 1CY           0
 3 A     c          2020 1CY           0
 4 A     a          2021 2CY           1
 5 A     b          2021 2CY           1
 6 A     c          2021 2CY           1
 7 B     a          2017 1CY           0
 8 B     b          2017 1CY           0
 9 B     c          2017 1CY           0
10 B     a          2019 >2CY          2
11 B     b          2019 >2CY          2
12 B     c          2019 >2CY          2
13 B     a          2020 >2CY          3
14 B     b          2020 >2CY          3
15 B     c          2020 >2CY          3
16 B     a          2021 >2CY          4
17 B     b          2021 >2CY          4
18 B     c          2021 >2CY          4
19 C     a          2018 >2CY          2
20 C     b          2018 >2CY          2
21 C     c          2018 >2CY          2
22 C     a          2019 >2CY          3
23 C     b          2019 >2CY          3
24 C     c          2019 >2CY          3
25 C     a          2020 >2CY          4
26 C     b          2020 >2CY          4
27 C     c          2020 >2CY          4