我如何在一个列中捕获所有年龄,其中一组值为“20 至 24 岁”,另一组为“22 至 24 岁”?这将使我能够确认我在tidycensus(R 包)美国人口普查 API 查询中捕获了所有工作年龄(18-64 岁)变量名称。
目标
我想要的是,对于这个例子中的 20-24 岁,一个从标签条目中提取年龄的数据框,例如"22 to 24 years"
:
MEN WOMEN ETHNORACE
18 18 BLACK
19 19 BLACK
20 20 BLACK
21 21 BLACK
22 22 BLACK
23 23 BLACK
24 BLACK
然后,我可以轻松地创建一个包含所有年龄的数据框并进行比较以查看是否缺少任何数据。
人口普查变量(tidycensus)
可以在https://api.census.gov/data/2019/acs/acs5/variables.html看到,至少美国人口普查局的美国社区调查 (ACS) 具有不同语法的年龄范围字段(例如“20年”和“22 至 24 年”):
tidycensus 包的 load_variables 函数中的示例行
tidycensus R 包 1.1 版
## Example rows from tidycensus using:
library(tidycensus)
library(magrittr)
library(stringr)
v19 <- load_variables(2019, "acs5", cache = TRUE)
v19 %>%
dplyr::filter(
str_detect(label, "18|20|24") &
concept %in% c("SEX BY AGE",
"SEX BY AGE (BLACK OR AFRICAN AMERICAN ALONE)") &
grepl('FEMALE', toupper(label))
)
v19_Total_AndBlack_Age18_24 <-
v19 %>% dplyr::filter(
str_detect(label, "18|20|24") &
concept %in% c("SEX BY AGE",
"SEX BY AGE (BLACK OR AFRICAN AMERICAN ALONE)") &
grepl('FEMALE', toupper(label)))
print(v19_Total_AndBlack_Age18_24)
name label concept
<chr> <chr> <chr>
1 B01001_031 Estimate!!Total:!!Female:!!18 and 19 years SEX BY AGE
2 B01001_032 Estimate!!Total:!!Female:!!20 years SEX BY AGE
3 B01001_034 Estimate!!Total:!!Female:!!22 to 24 years SEX BY AGE
4 B01001B_022 Estimate!!Total:!!Female:!!18 and 19 years SEX BY AGE (BLACK OR AFRICAN AMERICAN ALONE)
5 B01001B_023 Estimate!!Total:!!Female:!!20 to 24 years SEX BY AGE (BLACK OR AFRICAN AMERICAN ALONE)
...
在此示例中,我想确保从18到 24 岁的总人口和黑人人口的每个年龄都存在于如下所示的数据框中 - 请注意使用上面的人口普查 API 名称v19_Total_AndBlack_Age18_24
。
v19_Total_AndBlack_Age18_24 <-
get_acs(
year = 2019,
geography = "zcta",
variables = c(v19_Total_AndBlack_Age18_24$name)
)
请注意,Total的“ 22到 24 年”与Black的“ 20到 24 年”相比。
让我们关注v19_Total_AndBlack_Age18_24
上面的数据框,它列出了 18 - 24 岁的人口普查 API 名称和标签,旨在确认所有年份都存在。
我可以通过以下方式使用正则表达式获取年龄中的所有数字:
unlist(str_extract_all(v19_Total_AndBlack_Age18_24$label,"\\d{2}"))
[1] "18" "19" "20" "22" "24" "18" "19" "20" "24"
但是我按类别分组的尝试失败了,当“to”这个词出现在“20 到 24”时,我仍然需要得到一个跨越年龄范围的向量。
v19_Total_AndBlack_Age18_24_grp <-
v19_Total_AndBlack_Age18_24 %>%
mutate(EthnoRace = case_when(
grepl('BLACK', concept) ~ "BLACK",
TRUE ~ "TOTAL"))
v19_Total_AndBlack_Age18_24_grp %>%
group_by(EthnoRace) %>%
mutate(ages = str_extract_all(label, "\\d{2"))
错误
Error: Problem with `mutate()` column `ages`.
i `ages = str_extract_all(label, "\\d{2")`.
x Error in {min,max} interval. (U_REGEX_BAD_INTERVAL, context=`\d{2`)
i The error occurred in group 1: Group = "TOTAL".