如何在R语言中最优解析人口调查数据字段?
宽格式CPS人口调查数据转长格式并解析字段
需求说明
原始数据为当前人口调查(CPS)的宽格式子集,列名包含种族、性别、年龄组(可选)及劳动力指标类型,需转换为长格式并拆分出维度字段(种族、性别、年龄),匹配目标格式。
解决代码
使用tidyverse工具包完成数据重塑与字段解析:
library(tidyverse) test_long <- test2 %>% # 保留标识列,将所有指标列转为长格式 pivot_longer( cols = -c(stfips, areatype, periodyear, period), names_to = "variable", values_to = "value" ) %>% # 拆分列名:分离维度信息与指标类型 separate(variable, into = c("dimensions", "indicator"), sep = "(?=laborforce|unemp|unemprate)") %>% # 从维度字符串提取种族、性别、年龄组 mutate( race = str_sub(dimensions, 1, 1), gender = str_sub(dimensions, 2, 2), age = ifelse(str_length(dimensions) > 2, str_sub(dimensions, 3, -1), "all") ) %>% # 将指标类型转回宽列,匹配目标字段 pivot_wider( names_from = indicator, values_from = value ) %>% # 调整列顺序并移除无完整指标的行 select(stfips, areatype, periodyear, period, race, gender, age, laborforce, unemp, unemprate) %>% drop_na(laborforce, unemp, unemprate)
代码解释
pivot_longer:把宽格式的指标列统一转为variable-value结构,保留stfips等4个标识列。separate:利用正向预查正则规则,拆分出列名里的维度信息(种族+性别+年龄)和指标类型(laborforce/unemp等)。mutate:从维度字符串中提取首字符作为种族、第二个字符作为性别;若字符串长度超过2,剩余部分为年龄组,否则标记为"all"(全年龄)。pivot_wider:把拆分后的指标类型转回宽列,得到laborforce、unemp、unemprate三个数值列。select+drop_na:调整列顺序匹配目标格式,移除缺少完整指标的行(比如仅包含balaborforce的行)。
部分结果展示
> head(test_long, 12) stfips areatype periodyear period race gender age laborforce unemp unemprate 1 32 1 2021 1 x a all 1210.9 55.7 2.3 2 32 1 2021 2 x a all 1215.3 55.2 2.5 3 32 1 2021 3 x a all 1200.6 65.2 2.7 4 32 1 2021 4 x a all 1201.6 321.2 2.9 5 32 1 2021 5 x a all 1202.8 77.8 3.2 6 32 1 2021 6 x a all 1209.3 88.5 6.5 7 32 1 2021 7 x a all 1199.2 92.4 6.0 8 32 1 2021 8 x a all 1198.9 102.6 12.5 9 32 1 2021 1 w a all 1000.0 50.2 3.4 10 32 1 2021 2 w a all 999.2 49.5 3.6 11 32 1 2021 3 w a all 1000.5 51.6 3.8 12 32 1 2021 4 w a all 1001.5 251.2 4.0
内容的提问来源于stack exchange,提问作者Tim Wilcox
相关产品推荐
相关产品推荐

