r-使用模糊匹配或grep来检查字符串是否在多个列中匹配,以删除某些语法术语



我正在为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))

最新更新