如何将tidycensus输出的变量替换为描述性名称?
为ACS5 DP05数据集设置描述性列名的方法
方法一:利用load_variables结果批量重命名列
你已经通过load_variables获取了DP05表的变量描述,只需建立原始列名和描述的映射关系,就能一键重命名:
- 先筛选出DP05相关的变量信息:
# 提取DP05表的变量名和对应描述 dp05_vars <- mn2022 %>% filter(grepl("^DP05_", name)) %>% select(name, label)
- 构建列名映射(适配宽格式的
E/M后缀,分别对应估计值和边际误差):
# 创建原始列名到新描述性列名的映射向量 name_mapping <- dp05_vars %>% mutate( # 生成带E/M后缀的原始列名和对应的描述性名称 original_e = paste0(name, "E"), original_m = paste0(name, "M"), new_e = paste0(label, " (估计值)"), new_m = paste0(label, " (边际误差)") ) %>% # 转换为长格式后提取映射关系 pivot_longer( cols = c(original_e, original_m), names_to = "type", values_to = "original_col" ) %>% pivot_longer( cols = c(new_e, new_m), names_to = "type2", values_to = "new_col" ) %>% filter(str_remove(type, "original_") == str_remove(type2, "new_")) %>% select(original_col, new_col) %>% deframe() # 保留地理标识列的名称(如GEOID、NAME) geo_mapping <- c("GEOID" = "GEOID", "NAME" = "县名称") name_mapping <- c(geo_mapping, name_mapping)
- 对数据集执行重命名:
mn_val_wide_named <- mn_val_wide %>% rename(!!!name_mapping)
方法二:从长格式数据直接生成带描述的宽表
如果一开始用长格式获取数据,合并描述后再转宽,流程会更直观:
# 获取长格式的ACS数据 mn_val_long <- get_acs( year = 2022, geography = "county", table = "DP05", state = "MN", output = "tidy", survey = "acs5" ) # 合并变量描述并生成新列名 mn_val_long_named <- mn_val_long %>% left_join(mn2022, by = c("variable" = "name")) %>% mutate( measure_type = ifelse(moe, "边际误差", "估计值"), new_col_name = paste0(label, " (", measure_type, ")") ) # 转换为宽格式 mn_val_wide_named2 <- mn_val_long_named %>% select(GEOID, NAME, new_col_name, estimate) %>% pivot_wider(names_from = new_col_name, values_from = estimate)
方法三:为变量添加标签(保留原始列名的同时显示描述)
如果不想修改列名,只想在查看或导出时显示描述,可以用var_label给变量添加标签:
# 为每个DP05变量添加描述性标签 mn_val_wide_labeled <- mn_val_wide %>% mutate(across(starts_with("DP05_"), function(x) { # 提取不带E/M后缀的变量名 var_code <- str_remove(cur_column(), "[EM]$") # 匹配对应的描述 var_desc <- dp05_vars$label[dp05_vars$name == var_code] # 添加标签(标注是估计值还是边际误差) var_label(x) <- paste0(var_desc, " (", str_extract(cur_column(), "[EM]$"), ")") return(x) })) # 查看带标签的数据(用View或tibble打印时会显示标签) View(mn_val_wide_labeled)
内容的提问来源于stack exchange,提问作者ryanasaurus
相关产品推荐
相关产品推荐

