将summary_at()与不同的funs()参数一起使用...以及其他与误差幅度有关的Q

时间:2018-07-25 01:58:53

标签: r dplyr standard-error census tidycensus

我正处于构建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列,并运行单独的误差计算边际,然后重新组合数据。关于如何进行的任何想法?数据的结构如何?

0 个答案:

没有答案