You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用tidycensus API合并三州种族数据为数据框并通过spread函数生成种族列

解决方案

先修正两个关键问题

  1. merge()函数仅支持两两合并,无法一次传入三个数据框,这是你报错的直接原因。
  2. 你的代码最后用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.25 22:15:39