如何使用tidycensus API合并三州种族数据为数据框并通过spread函数生成种族列
解决方案
先修正两个关键问题
merge()函数仅支持两两合并,无法一次传入三个数据框,这是你报错的直接原因。- 你的代码最后用
get_acs()重新赋值了ny变量,把之前获取的十年普查种族数据完全覆盖了,后续合并会丢失原始数据,必须给不同来源的数据单独命名。
步骤1:重新获取并命名三州种族数据
给每个州的种族数据单独命名,避免覆盖:
racevars <- c(White = "P2_005N", Black = "P2_006N", Asian = "P2_008N", Hispanic = "P2_002N") # NY种族数据 ny_race <- get_decennial( geography = "tract", variables = racevars, state = "NY", geometry = TRUE, summary_var = "P2_001N", year = 2020 ) # NJ种族数据 nj_race <- get_decennial( geography = "tract", variables = racevars, state = "NJ", geometry = TRUE, summary_var = "P2_001N", year = 2020 ) # CT种族数据 ct_race <- get_decennial( geography = "tract", variables = racevars, state = "CT", geometry = TRUE, summary_var = "P2_001N", year = 2020 )
步骤2:合并三州数据
因为三个数据框结构完全一致,用dplyr::bind_rows()做行合并,同时添加state列标记数据所属州:
library(dplyr) library(tidyr) total_race <- bind_rows( ny_race %>% mutate(state = "NY"), nj_race %>% mutate(state = "NJ"), ct_race %>% mutate(state = "CT") )
步骤3:用spread(或推荐的pivot_wider)生成种族单独列
用spread(旧版tidyr函数):
# 先计算种族人口占比(按需选择) total_race <- total_race %>% mutate(percent = 100 * (value / summary_value)) # 转成宽表,每个种族对应一列 total_race_wide <- total_race %>% select(GEOID, NAME, state, variable, percent, geometry) %>% # 保留需要的列 spread(key = variable, value = percent)
用pivot_wider(tidyr 1.0.0+推荐函数):
total_race_wide <- total_race %>% mutate(percent = 100 * (value / summary_value)) %>% select(GEOID, NAME, state, variable, percent, geometry) %>% pivot_wider(names_from = variable, values_from = percent)
内容的提问来源于stack exchange,提问作者WutsKraken
相关产品推荐
相关产品推荐

