我正处于构建package以便使用来自HUD的CHAS数据的早期阶段。数据基本上是重新包装的ACS数据,已针对家庭收入中位数的区域差异进行了调整,并创建了自定义列表。从最小的人口普查区到最大的州,在几个地理级别上都有18个表格。在2013年之前,地区级别的文件是根据地方和县划分的。也就是说,如果人口普查区在一个城市中,一部分在另一座城市中,并且在县的未合并的一部分中,则该人口普查区将有三个记录。除了每个表产生的估计值之外,还报告了误差范围。表格设计如下:
GEOID headvar_2 T8_est1 T8_est2 T8_est3 ... T8_moe1 T8_moe2 T8_moe3
1011.1 Tct 11, pt1 224 0 0 38 12 12
1011.2 Tct 11, pt2 etc..................
1013.1 Tct 13, pt1
1013.2 Tct 13, pt2
1014.0 Tct 14
我创建的函数基本上清除了一些标题字段,并且可以将数据转换为长格式,如下所示:
GEOID headvar_2 table var_type var value
1011.1 Tct 11, pt1 T8 est 1 224
1011.1 Tct 11, pt1 T8 est 2 0
1011.1 Tct 11, pt1 T8 est 3 0
1011.1 Tct 11, pt1 T8 moe 1 38
1011.1 Tct 11, pt1 T8 moe 2 12
1011.1 Tct 11, pt1 T8 moe 3 12
上面的示例是我想要的格式,但是我不确定如何以我目前在R语言中的知识/技能水平用dplyr对其进行总结,因此它们仍然采用宽格式。
我遇到的真正问题是如何总结(汇总)按GEOID分组的估算值,同时正确计算误差范围并保留辅助头文件。 tidycensus程序包具有误差范围功能,如果我能弄清楚如何使用它,那将是一个很好的选择。
cleanup_chas_tract <- function(chas_tract_data, year = 2015) {
# Establish field names to help with field ordering
refcols <- c('source', 'sumlevel', 'geoid', 'geoid2', 'name', 'st', 'cnty_plc')
# Clean up header columns this way if year is after 2012
if (year >= 2013) {
chas_tract_data <- chas_tract_data %>% select(-tract)
names(chas_tract_data)[names(chas_tract_data) == 'cnty'] <- 'cnty_plc'
chas_tract_data$geoid2 <- substr(chas_tract_data$geoid, 8, 18)
chas_tract_data <- chas_tract_data[, c(refcols, setdiff(names(chas_tract_data), refcols))]
return(chas_tract_data)
}
# Clean up header columns a little differently AND sum by split tract ID (geoid2) if 2009 to 2012
else if (year %in% c(2009, 2010, 2011, 2012)) {
chas_tract_data$name <- ''
chas_tract_data$st <- substr(chas_tract_data$geoid, 8, 9)
chas_tract_data$cnty_plc <- substr(chas_tract_data$geoid, 10, 12)
chas_tract_data$geoid2 <- paste0(substr(chas_tract_data$geoid, 8, 12), substr(chas_tract_data$geoid, 23, 28))
# chas_header <- chas_tract_data[1:7]
chas_tract_data <- chas_tract_data[, c(refcols, setdiff(names(chas_tract_data), refcols))]
chas_tract_data <- chas_tract_data %>%
group_by(source, sumlevel, geoid2, name, st, cnty_plc) %>%
summarize_at(vars(names(chas_tract_data[,8:length(names(chas_tract_data))])), funs(sum))
return(chas_tract_data)
} else return(warning("Error: Please select a valid year (2009 through 2015). CHAS 2000 under development."))
}
因此,这可以对部分分束的估计求和,但是它只是将误差范围加在一起,而这并不是正确的方法。问题似乎是表需要单独的函数才能出现,但是我不确定如何构造数据来实现此目的。一种可能的解决方案是仅用grepl
子集moe列,并运行单独的误差计算边际,然后重新组合数据。关于如何进行的任何想法?数据的结构如何?