首页 > 解决方案 > 使用带有不同 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并运行单独的误差范围计算,然后重新组合数据。关于如何进行的任何想法?如何组织数据?

标签: rdplyrstandard-errorcensustidycensus

解决方案


推荐阅读