如何在R中找到一个地方的所有美国人口普查区域?

3

有几个 R 包可以更轻松地处理美国人口普查数据。我最常用的两个是 tigris(用于加载空间数据)和 acs(用于加载表格数据)。

然而,我经常遇到的一个问题是,我无法找到一种高效、可靠的方法来确定某个地方(如城市或县)内所有的区域(如人口普查区、街区组、邮政编码等),而不离开 R 控制台。

例如,如果我想要使用西雅图的人口普查区块数据,我将首先使用 tigris::tracts 下载华盛顿州金县的空间数据:

library(tigris)
tr <- tigris::tracts(state = "WA", county = "King")

但不幸的是,目前没有明显的方法来对这些数据进行子集化,以仅包括西雅图地区。

glimpse(tr)
Observations: 398
Variables: 12
$ STATEFP  (chr) "53", "53", "53", "53", "53", "53", "53", ...
$ COUNTYFP (chr) "033", "033", "033", "033", "033", "033", ...
$ TRACTCE  (chr) "003800", "021500", "032704", "026200", "0...
$ GEOID    (chr) "53033003800", "53033021500", "53033032704...
$ NAME     (chr) "38", "215", "327.04", "262", "327.03", "3...
$ NAMELSAD (chr) "Census Tract 38", "Census Tract 215", "Ce...
$ MTFCC    (chr) "G5020", "G5020", "G5020", "G5020", "G5020...
$ FUNCSTAT (chr) "S", "S", "S", "S", "S", "S", "S", "S", "S...
$ ALAND    (dbl) 624606, 3485578, 17160645, 15242622, 10319...
$ AWATER   (dbl) 0, 412526, 447367, 526886, 175464, 0, 4360...
$ INTPTLAT (chr) "+47.6794093", "+47.7643848", "+47.4940877...
$ INTPTLON (chr) "-122.2955292", "-122.2737863", "-121.7717...

同样地,acs 软件包允许用户使用 geo.make功能创建人口普查数据的子集,但在我的示例中,如果我没有所有西雅图普查区 GEOID 的列表,这将对我没有帮助。

值得一提的是,我知道可以在其他地方确定此信息。 页面 在Census.gov FAQ中清楚说明了如何确定给定census Place中的所有普查区。 但是,考虑到这是许多与人口普查相关的分析的关键步骤,最好有一种方便的方法可以从 R 控制台中完成。

提前致谢。

编辑

尽管这个问题涉及空间数据,我最感兴趣的是找到一个非空间解决方案。例如,我更喜欢查询人口普查API并返回所需GEOIDs的向量的解决方案,而不是使用空间分析工具(例如rgeos::intersects)来创建向量。为什么?因为在这个过程中,空间方法更容易出现错误,而这是我们正在讨论的已知信息,而不是需要通过空间推断的东西。

我不这么认为。城市不适合于人口普查的地理层次结构。如果你可以在R之外做到这一点,为什么不开发一种在R内部实现的方法呢?其他人可能也会发现这很有帮助。 - alexwhitworth
@Alex 在人口普查层次结构中,城市属于“地点”类别。要在R之外获取此信息的方法(请参见我上面提供的链接)需要与美国FactFinder接口进行交互。这似乎是一个非常棘手的过程,难以编写成一个R函数,但如果您有想法,我很乐意听取。 - Tiernan
明白了。然而,总的观点仍然是成立的--地图块比州的等级低;因此,地图块和地点之间没有映射..... 关于你所写代码的想法:不幸的是,这不是我感兴趣的问题(并非有意冒犯),所以我对此没有想法。 - alexwhitworth
@Alex 对,使用地理编码层次结构代码是不可能的。但正如描述所示,我们谈论的是已知信息。因此,虽然我们无法使用人口普查地理实体层次结构提取它,但仍应该以某种方式访问该信息(我认为人口普查API是最好的选择)。 - Tiernan
3个回答

3
我经常需要同类数据,因此我编写了一个R包来完成这项工作。这个包叫做totalcensus。你可以在这里找到它:https://github.com/GL-Li/totalcensus
通过这个包,您可以非常容易地获得城镇、城市、县、都市区和所有其他地理区域的分段、街区组或街区水平的数据。例如,如果您想从2011-2015年ACS 5年调查中以街区组为单位获取各个地区的种族数据,只需运行以下代码:
mixed <- read_acs5year(
    year = 2015,
    states = c("ut", "ri"),
    table_contents = c(
        "white = B02001_002",
        "black = B02001_003",
        "asian = B02001_005"
    ),
    areas = c(
        "Lincoln town, RI",
        "Salt Lake City city, UT",
        "Salt Lake City metro",
        "Kent county, RI",
        "COUNTY = UT001",
        "PLACE = UT62360"
    ),
    summary_level = "block group"
)

它返回的数据如下所示:
#                      area               GEOID        lon      lat state population white black asian GEOCOMP SUMLEV                                                             NAME
#    1:    Lincoln town, RI 15000US440070115001  -71.46686 41.94419    RI       1561  1386   128    47     all    150 Block Group 1, Census Tract 115, Providence County, Rhode Island
#    2:    Lincoln town, RI 15000US440070115002  -71.47159 41.96754    RI        916   806    97     0     all    150 Block Group 2, Census Tract 115, Providence County, Rhode Island
#    3:    Lincoln town, RI 15000US440070115003  -71.47820 41.96364    RI       2622  2373    77    86     all    150 Block Group 3, Census Tract 115, Providence County, Rhode Island
#    4:    Lincoln town, RI 15000US440070115004  -71.47830 41.97346    RI       1605  1516    43     0     all    150 Block Group 4, Census Tract 115, Providence County, Rhode Island
#    5:    Lincoln town, RI 15000US440070116001  -71.44665 41.93120    RI        948   764     0     0     all    150 Block Group 1, Census Tract 116, Providence County, Rhode Island
# ---                                                                                                                                                                               
# 1129: Providence city, UT 15000US490050012011 -111.82424 41.69198    UT       2018  1877     0     0     all    150            Block Group 1, Census Tract 12.01, Cache County, Utah
# 1130: Providence city, UT 15000US490050012012 -111.80736 41.69323    UT       1486  1471     0     0     all    150            Block Group 2, Census Tract 12.01, Cache County, Utah
# 1131: Providence city, UT 15000US490050012013 -111.81310 41.65837    UT       1563  1440    15     0     all    150            Block Group 3, Census Tract 12.01, Cache County, Utah
# 1132: Providence city, UT 15000US490050012022 -111.85231 41.68674    UT       3894  3594     0     0     all    150            Block Group 2, Census Tract 12.02, Cache County, Utah
# 1133: Providence city, UT 15000US490059801001 -111.64525 41.67498    UT        118   118     0     0     all    150             Block Group 1, Census Tract 9801, Cache County, Utah

看起来像是一个很棒的软件包!我机器上没有200GB的空闲内存,但一旦有了,我一定会试用它。 - Tiernan
以上示例使用的是2015年ACS 5年调查数据,大约有50GB。如果您不需要真正使用人口普查2010年的数据,那么您无需下载它。 - GL_Li
啊,这很好知道。50GB 仍然会超出我的云设置的内存,但我可以尝试在我的旧笔记本电脑上运行它。 - Tiernan
1
如果你只关心几个州的数据,你可以只下载这些州的数据,例如 download_census("acs5year", 2015, c("MA", "CT"),并且可以从人口普查局2010年生成的数据中下载已经生成的数据 download_generated_data(),大约120MB。 - GL_Li
@GL_Li,如果我想创建一个将所有城市映射到人口普查区域的映射,我应该下载哪些数据?请查看此问题以获取更多详细信息。https://stackoverflow.com/q/75893626/4613606 - Gaurav Singhal

1
为了帮助其他遇到这个问题的人,我在这里添加了这个答案。您需要离开R控制台,但是有一个非常好的工具可以解决这个问题:密苏里大学人口普查数据中心的Geocorr应用程序。您可以选择Census place作为源地理位置,Census block作为目标地理位置,该应用程序将生成一个整洁的CSV文件,其中包含显示每个Census place中所有Census block的相关列表。

1
使用ggmaps包,我们可以进行反向地理编码,使用数据中的纬度/经度点获取信息。这将创建一个包含所有数据点城市名称的向量。
city <- vector(mode = "character", length=nrow(tr@data))
for (i in 1:nrow(tr@data))
    city[i] <- strsplit(revgeocode(c(as.numeric(tr@data[i,12]), 
                                     as.numeric(tr@data[i,11]))), ", ")[[1]][2]
head(city)
[1] "Seattle"          "Lake Forest Park" "North Bend"       "Tukwila"
      "Snoqualmie"       "Woodinville"

1
这个解决方案可行。不幸的是,地理参考所有这些点的过程非常耗时。我已经更新了我的问题,表明我更喜欢非空间解决方案。我们会看看是否有任何结果。谢谢@TomNash! - Tiernan
@TomNash,这段代码存在多个问题,首先tr@data会报错,然后revgeocode需要API密钥,最后格式已经改变,无法提供城市信息。 - Gaurav Singhal

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接