我正在为2009年至2020年所有ACS5年的tidyconsus变量创建一个代码簿。为了确保或标记多年来变量的任何差异,我试图在末尾加上一个复选栏。然而,在2018年,命名中心似乎发生了一些变化,我希望忽略这些变化,以确定真正的问题。
#selecing and recoding variables to pull in
dv_acs = c(
same1 = "B25002_001",
same2 = "B25002_002",
diff1 = "C24010_039"
)
#creating a loop to pull in an join a codebook for all years
out <- map(2009:2020, ~ {
nm <- str_c(c("label", "concept"), "_", .x)
load_variables(.x, "acs5") %>%
select(-any_of("geography")) %>%
filter(name %in% dv_acs) %>%
mutate(id = names(dv_acs), .before = 1) %>%
rename_with(~ nm, c("label", "concept"))
}) %>%
reduce(full_join)
#putting in checks
out <- out %>%
rowwise %>%
mutate(label_flag = n_distinct(unlist(across(starts_with('label'),
~ as.character(.x)))) == 1) %>%
ungroup
好吧,从上面开始,如果按照我希望的方式工作,前两个变量(same1,same2(将在label_flag列中获得TRUE值,但因为有一个":"在后来的几年里,它被引入到字符串中,结果是假的。为了进行比较,diff1在2009年和以后的标签之间有一个真正不同的值(它从"估计!!总计!女性"到"估计!"总计:!!女性:!!管理、商业、科学和艺术职业:",这应该在label_flag列中显示为FALSE。
我不知道是应该使用grepl介绍一些东西,还是以某种方式放入字符串dist,我很感激您提供的任何解决方案。
我们可以使用pmap
在以"label"开头的选定列的行上循环,删除所有:
,然后让n_distinct
只检查单个唯一值
library(dplyr)
library(purrr)
library(stringr)
out <- out %>%
mutate(label_flag = pmap_int(across(starts_with('label')),
~ n_distinct(str_remove_all(c(...), ":")) == 1))