使用tidycensus+map_dfr获取ACS数据时years列显示1:12而非实际年份的解决方法
解决方法
有两种简洁的方式可以让years列直接显示实际年份,无需手动修改,且能适配任意年份范围:
方法1:在get_acs中手动添加年份列(推荐)
直接在每个循环的结果里新增年份列,赋值为当前循环的年份.x,彻底避开.id的索引问题,逻辑更清晰:
acs_cv <- map_dfr( 2009:2020, ~get_acs( geography = "tract", state = "WY", variables = c("B25002_001", "B25002_002", "B25002_003"), year = .x, output = "wide", geometry = FALSE ) %>% mutate(year = .x) # 新增该行,直接添加正确年份列 ) head(acs_cv)
生成的year列会直接显示2009、2010…2020,未来调整年份范围(比如改成2015:2023)时,会自动对应正确年份。
方法2:给年份向量添加名称,利用.id获取实际年份
如果坚持使用.id参数,可先给年份向量设置与值相同的名称,这样map_dfr会用向量名称而非索引作为years列的值:
# 给年份向量命名,名字与年份值一致 year_vec <- set_names(2009:2020) acs_cv <- map_dfr( year_vec, ~get_acs( geography = "tract", state = "WY", variables = c("B25002_001", "B25002_002", "B25002_003"), year = .x, output = "wide", geometry = FALSE ), .id = "years" ) %>% mutate(years = as.integer(years)) # 可选:将字符型年份转为数值型 head(acs_cv)
这种方式下,years列会直接显示2009、2010等年份字符串,转成数值型后更便于后续分析。
两种方法都无需手动修改年份值,完全适配未来年份范围的调整。
内容的提问来源于stack exchange,提问作者tchoup
相关产品推荐
相关产品推荐

