Census Data Using an API on R studio

309 Views Asked by At

So, I am new to using R, so sorry if the questions seem a little basic!

But my work is asking me to look through census data using an API and identify some variables in each tract, then create a csv file they can look at. The code is fully written for me, I believe, but I need to change the variables to:

S2602_C01_023E - black / his 

S2602_C01_081E - unemployment rate 

S2602_C01_070E - not US citizen (divide by total population) 

S0101_C01_030E - # over 65 (divide by total pop)

S1603_C01_009E - # below poverty (divide by total pop)

S1251_C01_010E - # child under 18 (divide by # households)

S2503_C01_013E - median income 

S0101_C01_001E - total population 

S2602_C01_078E - in labor force 

And, I need to divide some of the variables, like I have written, and export all of this into a CSV file. I just don't really know what to do with the code..like I am just lost because I have never used R. I try changing the variables to the ones I need, but an error comes up. Any help would be greatly appreciated!

library(tidycensus)
library(tidyverse)
library(stringr)
library(haven)
library(profvis)

#list of variables possible
v18 <- load_variables(year = 2018,
                  dataset = "acs5",
                  cache = TRUE)
#function to get variables for all states. Year, variables can be 
easily edited.
get_census_data <- function(st) {
  Sys.sleep(5)
  df <- get_acs(year = 2018, 
            variables = c(totpop = "B01003_001",
                          male = "B01001_002",
                          female = "B01001_026",
                          white_alone = "B02001_002",
                          black_alone = "B02001_003",
                          americanindian_alone = "B02001_004",
                          asian_alone = "B02001_005",
                          nativehaw_alone = "B02001_006",
                          other_alone = "B02001_007",
                          twoormore = "B02001_008",
                          nh = "B03003_002",
                          his = "B03003_003",
                          noncit = "B05001_006",
                          povstatus = "B17001_002",
                          num_households = "B19058_001",
                          SNAP_households = "B19058_002",
                          medhhi = "B19013_001", 
                          hsdiploma_25plus = "B15003_017",
                          bachelors_25plus = "B15003_022",
                          greater25 = "B15003_001",
                          inlaborforce = "B23025_002",
                          notinlaborforce = "B23025_007",
                          greater16 = "B23025_001",
                          civnoninstitutional = "B27010_001",
                          withmedicare_male_0to19  = "C27006_004",
                          withmedicare_male_19to64 = "C27006_007",
                          withmedicare_male_65plus = "C27006_010",
                          withmedicare_female_0to19  = "C27006_014",
                          withmedicare_female_19to64 = "C27006_017",
                          withmedicare_female_65plus = "C27006_020",
                          withmedicaid_male_0to19  = "C27007_004",
                          withmedicaid_male_19to64 = "C27007_007",
                          withmedicaid_male_65plus = "C27007_010",
                          withmedicaid_female_0to19  = "C27007_014",
                          withmedicaid_female_19to64 = "C27007_017",
                          withmedicaid_female_65plus ="C27007_020"), 
            geography = "tract",
            state = st )
  return(df)
} 

#loops over all states
df_list <- setNames(lapply(states, get_census_data), states)

##if you want to keep margin of error, remove everything after %>% 
in next two lines
final_df <- bind_rows(df_list) %>%
  select(-moe)

colnames(final_df)[3] <- "varname"

#cleaning up final data, making it wide instead of long
final_df_wide <- final_df %>%
             gather(variable, value, -(GEOID:varname)) %>%
              unite(temp, varname, variable) %>%
              spread(temp, value)

#exporting to csv file, adjust your path

write.csv(final_df,"C:\Users\NAME\Documents\acs_2018_tractlevel_dat.
a.csv" )

1

There are 1 best solutions below

1
On

Since you can't really give an reproducible example without revealing your API key, I'll try my best to figure out what could work here:

Let's first edit the function that pulls data from the API:

get_census_data <- function(st) {
  Sys.sleep(5)
  df <- get_acs(year = 2018, 
            variables = c(blackHis= "S2602_C01_023E",
                          unEmployRate = "S2602_C01_081E",
                          notUSCit = "S2602_C01_070E")
            geography = "tract",
            state = st )
  return(df)
} 

I've just put in two of the variables, but you should get the point.

Try if this works for you. And returns the data that is stored in the respective variables.