r - 使用带有不同 funs() 参数的 summarise_at() 以及其他与误差幅度相关的 Q
问题描述
我正处于构建使用来自 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."))
}
因此,这可以对部分区域的估计值求和,但它只是将误差幅度加在一起,这不是正确的方法。问题似乎是表需要单独的功能才能发生,但我不确定如何构造我的数据来实现这一点。一种可能的解决方案是仅对 moe 列进行子集化,grepl
并运行单独的误差范围计算,然后重新组合数据。关于如何进行的任何想法?如何组织数据?
解决方案
推荐阅读
- go - 在 Visual Studio 代码中调试 cgo 会产生“多重定义”错误
- python - 绘制 n 次函数的图形
- java - Kafka Consumer - 从每个分区读取 2000 条 LATEST 消息
- c++ - 为什么将一个指针分配给另一个指针会改变 cpp 中的原始指针?
- swift - 从 anyObject 到坐标数组
- office-js - Outlook 加载项可操作消息“Action.InvokeAddInCommand”在 OWA 中没有模式
- amazon-web-services - EMR 集群卡在调整大小上
- ansible - 如何通过索引生成器结果中的列表来选择 1 项?
- mlt - MLT XML:为输入数据指定编解码器
- c# - 简单的 Injector 构造函数参数