用 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_number
将Age_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
我正在处理这样结构的年度观察数据集
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_number
将Age_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