创建新时代组
Creating New Age group
我有他们的一些年龄 (12:54) 和相关数据(这里是年份和 ASFR)。年份从 1933 年开始到 1987 年。
数据结构如下:
year
age
Asfr
1933
12
.00004
1933
13
.00044
1933
14
.00177
1933
15
.00672
1933
16
.01875
1933
17
.03846
1933
18
.06586
1933
19
.08719
...
...
...
1933
49
.00037
1933
50
.00009
1933
51
.00003
1933
52
.00003
1933
53
.00003
1933
54
.00002
现在,我需要一些代码,通过这些代码我可以将这些数据转换为具有以下结构的年龄组:
“15-19”、“20-24”、“25-29”、“30-34”、“35-39”、“40-44”、“45-49”
其中我希望 15-19 年龄组是 12、13、14、15、16、17、18、19 的总和
20-24 岁年龄段为 20、21、22、23、24 岁的总和
最后一个年龄组是45, 46, 47, 48, 49, 50, 51, 52, 53,54
如果有人能帮助我,我将不胜感激。非常感谢您。
您可以使用 dplyr
中的 case_when
:
library(dplyr)
df %>%
mutate(age_group = case_when(age %in% c(12:19) ~ "15-19",
age %in% c(20:24) ~ "20-24",
age %in% c(25:29) ~ "25-29",
age %in% c(30:34) ~ "30-34",
age %in% c(35:39) ~ "35-39",
age %in% c(40:44) ~ "40-44",
age %in% c(45:49) ~ "45-49",
age > 49 ~ "50+")) %>%
group_by(age_group, year) %>%
summarize(total_asfr = sum(Asfr),
age_group_n = n()) %>%
ungroup()
这给了我们:
# A tibble: 5 × 3
age_group total_asfr age_group_n
<chr> <dbl> <int>
1 15-19 0.0385 2
2 20-24 0.00044 1
3 30-34 0.00177 1
4 45-49 0.00672 1
5 50+ 0.0188 1
使用示例数据:
df <- structure(list(year = c(1933L, 1933L, 1933L, 1933L, 1933L, 1933L
), age = c(12L, 23L, 34L, 45L, 56L, 17L), Asfr = c(4e-05, 0.00044,
0.00177, 0.00672, 0.01875, 0.03846)),
row.names = c(NA, -6L),
class = "data.frame")
这是一个可能的解决方案:
# Import tidyverse or dplyr
library(tidyverse)
#create the age groups and group by Year and age_groups
df %>% mutate(age_groups = cut(df$age,
breaks=c(12, 20, 25, 30, 35, 40, 45,55),
right= F) ) %>%
group_by(year, age_groups) %>%
summarise(asfr_total = sum(Asfr))
你应该看到这样的东西:
year age_groups asfr_total
<dbl> <fct> <dbl>
1 1933 [12,20) 4.32
2 1933 [20,25) 2.33
3 1933 [25,30) 2.68
4 1933 [30,35) 2.89
5 1933 [35,40) 2.23
6 1933 [40,45) 2.85
7 1933 [45,55) 6.05
我有他们的一些年龄 (12:54) 和相关数据(这里是年份和 ASFR)。年份从 1933 年开始到 1987 年。 数据结构如下:
year | age | Asfr |
---|---|---|
1933 | 12 | .00004 |
1933 | 13 | .00044 |
1933 | 14 | .00177 |
1933 | 15 | .00672 |
1933 | 16 | .01875 |
1933 | 17 | .03846 |
1933 | 18 | .06586 |
1933 | 19 | .08719 |
... | ... | ... |
1933 | 49 | .00037 |
1933 | 50 | .00009 |
1933 | 51 | .00003 |
1933 | 52 | .00003 |
1933 | 53 | .00003 |
1933 | 54 | .00002 |
现在,我需要一些代码,通过这些代码我可以将这些数据转换为具有以下结构的年龄组:
“15-19”、“20-24”、“25-29”、“30-34”、“35-39”、“40-44”、“45-49”
其中我希望 15-19 年龄组是 12、13、14、15、16、17、18、19 的总和
20-24 岁年龄段为 20、21、22、23、24 岁的总和
最后一个年龄组是45, 46, 47, 48, 49, 50, 51, 52, 53,54
如果有人能帮助我,我将不胜感激。非常感谢您。
您可以使用 dplyr
中的 case_when
:
library(dplyr)
df %>%
mutate(age_group = case_when(age %in% c(12:19) ~ "15-19",
age %in% c(20:24) ~ "20-24",
age %in% c(25:29) ~ "25-29",
age %in% c(30:34) ~ "30-34",
age %in% c(35:39) ~ "35-39",
age %in% c(40:44) ~ "40-44",
age %in% c(45:49) ~ "45-49",
age > 49 ~ "50+")) %>%
group_by(age_group, year) %>%
summarize(total_asfr = sum(Asfr),
age_group_n = n()) %>%
ungroup()
这给了我们:
# A tibble: 5 × 3
age_group total_asfr age_group_n
<chr> <dbl> <int>
1 15-19 0.0385 2
2 20-24 0.00044 1
3 30-34 0.00177 1
4 45-49 0.00672 1
5 50+ 0.0188 1
使用示例数据:
df <- structure(list(year = c(1933L, 1933L, 1933L, 1933L, 1933L, 1933L
), age = c(12L, 23L, 34L, 45L, 56L, 17L), Asfr = c(4e-05, 0.00044,
0.00177, 0.00672, 0.01875, 0.03846)),
row.names = c(NA, -6L),
class = "data.frame")
这是一个可能的解决方案:
# Import tidyverse or dplyr
library(tidyverse)
#create the age groups and group by Year and age_groups
df %>% mutate(age_groups = cut(df$age,
breaks=c(12, 20, 25, 30, 35, 40, 45,55),
right= F) ) %>%
group_by(year, age_groups) %>%
summarise(asfr_total = sum(Asfr))
你应该看到这样的东西:
year age_groups asfr_total
<dbl> <fct> <dbl>
1 1933 [12,20) 4.32
2 1933 [20,25) 2.33
3 1933 [25,30) 2.68
4 1933 [30,35) 2.89
5 1933 [35,40) 2.23
6 1933 [40,45) 2.85
7 1933 [45,55) 6.05