From c50583741240ee838a20e77c9dac79a3dffccee0 Mon Sep 17 00:00:00 2001 From: Ansh Pathak Date: Thu, 10 Jul 2025 00:08:59 -0500 Subject: [PATCH 1/2] 3 --- inst/tutorials/99-overview/tutorial.Rmd | 622 ++++++++++++++++-------- 1 file changed, 415 insertions(+), 207 deletions(-) diff --git a/inst/tutorials/99-overview/tutorial.Rmd b/inst/tutorials/99-overview/tutorial.Rmd index 9248500..bf726c0 100644 --- a/inst/tutorials/99-overview/tutorial.Rmd +++ b/inst/tutorials/99-overview/tutorial.Rmd @@ -29,77 +29,6 @@ options(tutorial.exercise.timelimit = 600, ```{r info-section, child = system.file("child_documents/info_section.Rmd", package = "tutorial.helpers")} ``` - - -## Introduction -### - - -### Exercise 1 - -Go to the [Census website](https://api.census.gov/data/key_signup.html) to request a Census API key. The "Organization Name" you provide can be anything, including your current or former school. This key will allows you to download, for free, US Census data. The key will be emailed to you, but it may take a bit of time. You can still proceed with this tutorial without it. - -From the Console, run `Sys.getenv("CENSUS_API_KEY")`. CP/CR. - -```{r introduction-1} -question_text(NULL, - answer(NULL, correct = TRUE), - allow_retry = TRUE, - try_again_button = "Edit Answer", - incorrect = NULL, - rows = 3) -``` - -Note that, because we have not done anything with your key yet --- in fact, the Census may not have even emailed it back to you --- this command should return `""`. - -### - -And that is OK! We have not created the `CENSUS_API_KEY` environment variable yet. We will create this variable at the end of this tutorial. - - -### Exercise 2 - -Load the **tidyverse** package. - - -```{r introduction-2, exercise = TRUE} - -``` - -```{r introduction-2-hint-1, eval = FALSE} -library(...) -``` - -```{r introduction-2-test, include = FALSE} -library(tidyverse) -``` - -### - -Aggregate data from the decennial US Census, American Community Survey, and other Census surveys are made available to the public at different enumeration units. - -### - -Enumeration units are geographies at which Census data are tabulated. They include both legal entities such as states and counties, and statistical entities that are not official jurisdictions but used to standardize data tabulation. - -### Exercise 3 - -Load the **tidycensus** package. - -```{r introduction-3, exercise = TRUE} - -``` - -```{r introduction-3-hint-1, eval = FALSE} -library(...) -``` - -```{r introduction-3-test, include = FALSE} -library(tidycensus) -``` - -### - ## Texas Income @@ -110,7 +39,7 @@ The smallest unit at which data are made available from the decennial US Census ### Exercise 1 -Create a Github repo called `Tidycensus-plots`. Make sure to click the "Add a README file" check box. +Create a Github repo called `tidycensus-plots`. Make sure to click the "Add a README file" check box. Connect the repo to a project on your computer using `File -> New Folder from Git ...`. Make sure to select the "Open in a new window" box. @@ -145,8 +74,6 @@ Professionals keep their data science work in the cloud because laptops fail. ### Exercise 2 - - In your QMD, put `library(tidyverse)` and `library(tidycensus)` in a new code chunk. Press Ctrl/Cmd + Shift + K to render the file Notice that the file does not look good because the code is visible and there are annoying messages. To take care of this, add `#| message: false` to remove all the messages in this `setup` chunk. Also add the following to the YAML header to remove all code echos from the HTML: @@ -179,8 +106,6 @@ Render again. Everything looks nice, albeit empty, because we have added code to ### Exercise 3 - - Place your cursor in the QMD file on the `library(tidyverse)` line. Use `Cmd/Ctrl + Enter` to execute that line. Note that this causes `library(tidyverse)` to be copied down to the Console and then executed. @@ -198,22 +123,17 @@ question_text(NULL, ### - +Always pair `get_acs()` with tidyverse functions for filtering, transforming, and visualizing your data. ### Exercise 4 -In this exercise, you will use an AI assistant (such as ChatGPT) to generate R code that: +In this exercise, you will use an AI assistant (such as ChatGPT) to generate R code to collect data. -- Loads the `tidycensus` and `tidyverse` libraries. -- Uses `get_acs()` to download median household income (`B19013_001`) data for **all counties in Texas** for the year **2020**. -- Saves the data to a variable named `income_tx`. -- Includes `geometry = TRUE` so the data includes spatial information. +Open your AI and tell it to use tidycensus to get data on the median household income for all counties in Texas for 2020. -**Instructions:** +Put what it gives you in your code chunk and do `Ctrl/Cmd + Enter` to send it to the console -1. Ask an AI assistant to generate the required R code to do the above. -2. Copy and paste the AI-generated code into your Quarto document and run it (Press Cmd/Ctrl + Enter and send the chunk to the console). -3. Copy the output from your Console and paste it here (CP/CR). +CP/CR ```{r texas-income-4} question_text(NULL, @@ -224,15 +144,37 @@ question_text(NULL, rows = 6) ``` +### + +Tip: Always inspect your output using `glimpse()` or `head()` before plotting. + +### Exercise 5 + +Now ask your AI to include `geometry = TRUE` + +Put what it gives you in your code chunk and do `Ctrl/Cmd + Enter` to send it to the console + +CP/CR + +```{r texas-income-5} +question_text(NULL, + answer(NULL, correct = TRUE), + allow_retry = TRUE, + try_again_button = "Edit Answer", + incorrect = NULL, + rows = 6) +``` ### -Now, replace the code it gave you with this code: + The `geometry = TRUE` argument returns spatial polygons, useful for maps and spatial analysis. -```r -library(tidycensus) -library(tidyverse) +### Exercise 6 + +Here is our code. It is okay if your code is different. That will happen when using AI! +Replace your code with what it gave you using this code: +```` income_tx <- get_acs( geography = "county", variables = "B19013_001", @@ -240,27 +182,23 @@ income_tx <- get_acs( year = 2020, geometry = TRUE ) -``` +```` -`get_acs()` is part of the tidycensus package and allows downloading American Community Survey (ACS) data. The `geometry = TRUE` argument returns spatial polygons, useful for maps and spatial analysis. +### -### Exercise 5 +`get_acs()` is part of the tidycensus package and allows downloading American Community Survey (ACS) data. + +### Exercise 7 Now you will use AI to generate code that creates a plot of median household income in Texas counties. -The goal is to create a choropleth map using `ggplot2` showing the median income by county using the `income_tx` dataset. +Send our code to the console from the previous exercise. -**Instructions:** +Now, type `income_tx` in the console. -1. Ask an AI assistant to generate R code that: - - Uses `ggplot2` to create a choropleth map of median household income. - - Uses `geom_sf()` to plot the spatial data. - - Colors counties by the estimate column. - - Adds appropriate titles and themes. -2. Copy and paste the AI-generated code into your Quarto document and run it. -3. Copy the output from your Console and paste it here (CP/CR). +CP/CR the first few lines. -```{r texas-income-5} +```{r texas-income-7} question_text(NULL, answer(NULL, correct = TRUE), allow_retry = TRUE, @@ -271,12 +209,61 @@ question_text(NULL, ### -Now, replace the code it gave you with this code: +`ggplot2` is ideal for Census data due to its support for basic charts, group comparisons, and geospatial visualizations. + + +### Exercise 8 + +Now copy the first few lines into your AI and say that you are working with tidyverse. Tell it to take the data in `income_tx` and make a choropleth map of median household income. + + +Put what it gives you in your code chunk and do `Ctrl/Cmd + Enter` to send it to the console + +CP/CR + +```{r texas-income-8} +question_text(NULL, + answer(NULL, correct = TRUE), + allow_retry = TRUE, + try_again_button = "Edit Answer", + incorrect = NULL, + rows = 6) +``` + +### + +You can create histograms, bar charts, and scatterplots of Census variables using `ggplot()`, often starting with `aes(x = estimate)` or `aes(x = var1, y = var2)` + +### Exercise 9 + +Now, ask the AI to color counties by the estimate column and add an approprite title and theme. -```r -library(ggplot2) -income_map <- ggplot(income_tx) + +Put what it gives you in your code chunk and do `Ctrl/Cmd + Enter` to send it to the console + +CP/CR + +```{r texas-income-9} +question_text(NULL, + answer(NULL, correct = TRUE), + allow_retry = TRUE, + try_again_button = "Edit Answer", + incorrect = NULL, + rows = 6) +``` +### + + +When mapping spatial Census data, use `geom_sf()` in `ggplot2` and apply `fill = estimate` to show choropleth patterns. + + +### Exercise 10 + +Here is our code. It is okay if your code is different. That will happen when using AI! +Replace your code with what it gave you using this code: + +```` +ggplot(income_tx) + geom_sf(aes(fill = estimate), color = "white", size = 0.2) + scale_fill_viridis_c(option = "plasma", name = "Median Income") + labs( @@ -284,14 +271,13 @@ income_map <- ggplot(income_tx) + caption = "Data source: ACS 5-year estimates" ) + theme_minimal() +```` -income_map -``` +### +`geom_sf()` plots spatial data stored as simple features (`sf` objects). The `fill` aesthetic maps color to median income. The `viridis` color scale provides perceptually uniform colors for better interpretation. ```{r} #| message: false -library(tidycensus) -library(tidyverse) income_tx <- get_acs( geography = "county", @@ -301,9 +287,7 @@ income_tx <- get_acs( geometry = TRUE ) -library(ggplot2) - -income_map <- ggplot(income_tx) + +ggplot(income_tx) + geom_sf(aes(fill = estimate), color = "white", size = 0.2) + scale_fill_viridis_c(option = "plasma", name = "Median Income") + labs( @@ -311,18 +295,16 @@ income_map <- ggplot(income_tx) + caption = "Data source: ACS 5-year estimates" ) + theme_minimal() - -income_map ``` -### Exercise 6 +### Exercise 11 1. In the Console, run the following command to display the last chunk of your `.qmd` file: CP/CR tutorial.helpers::show_file("TexasIncome.qmd", chunk = "last") -```{r texas-income-6} +```{r texas-income-11} question_text(NULL, answer(NULL, correct = TRUE), allow_retry = TRUE, @@ -336,35 +318,44 @@ question_text(NULL, The `show_file()` function from tutorial.helpers is a convenient way to check the contents of files without leaving R. It helps confirm that your edits were saved properly. +## California Bachelors Degree -`geom_sf()` plots spatial data stored as simple features (`sf` objects). The `fill` aesthetic maps color to median income. The `viridis` color scale provides perceptually uniform colors for better interpretation. -## California Bachelors Degree +### Exercise 1 + +Select `File -> New File -> Quarto Document ...`. Provide a title -- `"CaliforniaBachelors"` -- and an author (you). Render the document and save it as `CaliforniaBachelors.qmd`. + +In this exercise, we’ll get the percentage of adults with a bachelor’s degree or higher in each California county. + +### Did you know? Visualizing Maps with `geometry = TRUE` Passing `geometry = TRUE` to `get_acs()` returns spatial geometry as an `sf` object, which works well with `ggplot2` for choropleth maps. +### Exercise 2 -### Exercise 1 +In your QMD, put `library(tidyverse)` and `library(tidycensus)` in a new code chunk. Press Ctrl/Cmd + Shift + K to render the file -Select `File -> New File -> Quarto Document ...`. Provide a title -- `"CaliforniaBachelors"` -- and an author (you). Render the document and save it as `CaliforniaBachelors.qmd`. +Notice that the file does not look good because the code is visible and there are annoying messages. To take care of this, add `#| message: false` to remove all the messages in this `setup` chunk. Also add the following to the YAML header to remove all code echos from the HTML: -In this exercise, we’ll get the percentage of adults with a bachelor’s degree or higher in each California county. +``` +execute: + echo: false +``` + +In the Console, run: -- Ask an AI assistant (like ChatGPT) to generate R code that: +``` +tutorial.helpers::show_file("CaliforniaBachelors.qmd", start = -5) +``` -Loads `tidycensus` and `tidyverse` -Uses `get_acs()` to get educational attainment variables for all California counties in 2020 -Saves the result to a variable called `edu_ca` -Includes `geometry = TRUE` -Paste the AI-generated code into your Quarto file (`CaliforniaBachelors.qmd`). Run the code using `Cmd/Ctrl + Enter` in the QMD editor or render the file using `Ctrl/Cmd + Shift + K.` -Copy and paste the result from the Console here. CP/CR. +CP/CR. -```{r california-bachelors-degree-1} +```{r california-bachelors-degree-2} question_text(NULL, answer(NULL, correct = TRUE), allow_retry = TRUE, @@ -373,15 +364,82 @@ question_text(NULL, rows = 6) ``` +### + +Render again. Everything looks nice, albeit empty, because we have added code to make the file look better and more professional. + +### Exercise 3 + +Place your cursor in the QMD file on the `library(tidyverse)` line. Use `Cmd/Ctrl + Enter` to execute that line. + +Note that this causes `library(tidyverse)` to be copied down to the Console and then executed. + +CP/CR. + +```{r california-bachelors-degree-3} +question_text(NULL, + answer(NULL, correct = TRUE), + allow_retry = TRUE, + try_again_button = "Edit Answer", + incorrect = NULL, + rows = 3) +``` ### -Now, replace the code it gave you with this code: +Working in the console like this is how professionals work! -```r -library(tidycensus) -library(tidyverse) +### Exercise 4 +- Ask an AI assistant (like ChatGPT) to generate R code that uses tidycensus to get educational attainment variables for all California counties in 2020 and save it in a variable called `edu_ca` + +Put what it gives you in your code chunk and do `Ctrl/Cmd + Enter` to send it to the console + +CP/CR + + +```{r california-bachelors-degree-4} +question_text(NULL, + answer(NULL, correct = TRUE), + allow_retry = TRUE, + try_again_button = "Edit Answer", + incorrect = NULL, + rows = 6) +``` + + +### + +Did you know? You can use `load_variables()` and filter/search the resulting data frame to explore variable descriptions and codes, such as "`B19013_001`" for median household income. + +### Exercise 5 + +Now, tell your AI to add include `geometry = TRUE` + +Put what it gives you in your code chunk and do `Ctrl/Cmd + Enter` to send it to the console + +CP/CR + + +```{r california-bachelors-degree-5} +question_text(NULL, + answer(NULL, correct = TRUE), + allow_retry = TRUE, + try_again_button = "Edit Answer", + incorrect = NULL, + rows = 6) +``` + +### + +The American Community Survey (ACS) provides annual demographic, economic, and housing data based on samples, while the Decennial Census gives a complete count every 10 years. + +### Exercise 6 + +Here is our code. It is okay if your code is different. That will happen when using AI! +Replace your code with what it gave you using this code: + +```` edu_ca <- get_acs( geography = "county", variables = c("B15003_001", "B15003_022", "B15003_023", "B15003_024", "B15003_025"), @@ -390,28 +448,46 @@ edu_ca <- get_acs( geometry = TRUE, summary_var = "B15003_001" ) -``` +```` +### The `get_acs()` function is powerful for pulling American Community Survey (ACS) data. -For educational attainment, we use `B15003_022` through `B15003_025` to sum all individuals with a bachelor’s degree or more, then divide by the total population (variable `B15003_001`). -Geometry must be `TRUE` if we want to map later. -### Exercise 2 +### Exercise 7 We’ll now make a choropleth map of bachelor’s degree attainment across California counties. -Ask an AI assistant to write code that: +Send our code to the console from the previous exercise. -Uses `mutate()` to calculate the percentage of the population with at least a bachelor’s degree -Pipes that into a `ggplot()` -Uses `geom_sf(aes(fill = percent))` and a `scale_fill_viridis_c()` to make it look nice -Adds labels and a title -Paste the AI-generated code into your Quarto document. Run it. +Now, type `edu_ca` in the console. -CP/CR. +CP/CR the first few lines. -```{r california-bachelors-degree-2} +```{r california-bachelors-degree-7} +question_text(NULL, + answer(NULL, correct = TRUE), + allow_retry = TRUE, + try_again_button = "Edit Answer", + incorrect = NULL, + rows = 3) +``` + +### + +Geometry must be `TRUE` if we want to map later. + +### Exercise 8 + +Now copy the first few lines into your AI and say that you are working with tidyverse. Tell it to take the data in `edu_ca` and make a choropleth map of at least bachelor’s degree attainment or higher across California counties. + +Tell it to also use `mutate()` to calculate the percentage of the population with at least a bachelor’s degree and pipe it into a `ggplot()` + +Put what it gives you in your code chunk and do `Ctrl/Cmd + Enter` to send it to the console + +CP/CR + +```{r california-bachelors-degree-8} question_text(NULL, answer(NULL, correct = TRUE), allow_retry = TRUE, @@ -422,9 +498,35 @@ question_text(NULL, ### -Now, replace the code it gave you with this code: +For educational attainment, we use `B15003_022` through `B15003_025` to sum all individuals with a bachelor’s degree or more, then divide by the total population (variable `B15003_001`). + +### Exercise 9 + +Now, tell it to also use `geom_sf(aes(fill = percent))` and a `scale_fill_viridis_c()` to make it look nice + +Put what it gives you in your code chunk and do `Ctrl/Cmd + Enter` to send it to the console + +CP/CR + +```{r california-bachelors-degree-9} +question_text(NULL, + answer(NULL, correct = TRUE), + allow_retry = TRUE, + try_again_button = "Edit Answer", + incorrect = NULL, + rows = 6) +``` -```r +### + +The `scale_fill_viridis_c()` function applies colorblind-friendly color scales to maps, using palettes like viridis, plasma, or magma. + +### Exercise 10 + +Here is our code. It is okay if your code is different. That will happen when using AI! +Replace your code with what it gave you using this code: + +```` edu_ca <- edu_ca %>% group_by(GEOID) %>% summarize( @@ -437,13 +539,10 @@ ggplot(edu_ca) + labs(title = "Adult Percentage with at least a Bachelor's in CA (2020)", fill = "% with Degree") + theme_minimal() -``` +```` ```{r} #| message: false -library(tidycensus) -library(tidyverse) - edu_ca <- get_acs( geography = "county", variables = c("B15003_001", "B15003_022", "B15003_023", "B15003_024", "B15003_025"), @@ -472,14 +571,14 @@ ggplot(edu_ca) + `ggplot2` can handle spatial data directly using `geom_sf()`. Use `mutate()` to calculate percentages, and pipe that into `ggplot()` for a map. -### Exercise 3 +### Exercise 11 1. In the Console, run the following command to display the last chunk of your `.qmd` file: CP/CR tutorial.helpers::show_file("CaliforniaBachelors.qmd", chunk = "last") -```{r california-bachelors-degree-3} +```{r california-bachelors-degree-11} question_text(NULL, answer(NULL, correct = TRUE), allow_retry = TRUE, @@ -499,27 +598,83 @@ The variables in `get_acs()` like `"B19013_001"` are codes that represent specif ## California Median Age - ### Exercise 1 Select `File -> New File -> Quarto Document ...`. Provide a title -- `"CaliforniaAge"` -- and an author (you). Render the document and save it as `CaliforniaAge.qmd`. In this exercise, you will collect median age data for all counties in California for the year 2020 using the `tidycensus` package. -The `get_acs()` function from `tidycensus` lets you download American Community Survey data. You specify geography, variables, state, and year. The variable `B01002_001` represents median age. +### + + + + +### Exercise 2 + +In your QMD, put `library(tidyverse)` and `library(tidycensus)` in a new code chunk. Press Ctrl/Cmd + Shift + K to render the file + +Notice that the file does not look good because the code is visible and there are annoying messages. To take care of this, add `#| message: false` to remove all the messages in this `setup` chunk. Also add the following to the YAML header to remove all code echos from the HTML: + +``` +execute: + echo: false +``` + +In the Console, run: + +``` +tutorial.helpers::show_file("CaliforniaAge.qmd", start = -5) +``` + +CP/CR. + +```{r california-median-age-2} +question_text(NULL, + answer(NULL, correct = TRUE), + allow_retry = TRUE, + try_again_button = "Edit Answer", + incorrect = NULL, + rows = 6) +``` + +### + +Render again. Everything looks nice, albeit empty, because we have added code to make the file look better and more professional. + +### Exercise 3 + +Place your cursor in the QMD file on the `library(tidyverse)` line. Use `Cmd/Ctrl + Enter` to execute that line. + +Note that this causes `library(tidyverse)` to be copied down to the Console and then executed. + +CP/CR. + +```{r california-median-age-3} +question_text(NULL, + answer(NULL, correct = TRUE), + allow_retry = TRUE, + try_again_button = "Edit Answer", + incorrect = NULL, + rows = 3) +``` + +### + +Working in the console like this is how professionals work! + + + +### Exercise 4 + + +Ask an AI assistant (such as ChatGPT) to generate R code that uses tidycensus data to get both the median age and populations for all counties in California for 2020 in a variable called `age_ca` -**Task:** -1. Ask an AI assistant (such as ChatGPT) to generate R code that: - - Loads the `tidycensus` and `tidyverse` libraries, - - Uses `get_acs()` to get median age (`B01002_001`) for all counties in California for 2020, - - Uses `get_acs()` to get population (`B01003_001`) for all counties in California for 2020, - - Saves the result to a variable called `age_ca`. +Put what it gives you in your code chunk and do `Ctrl/Cmd + Enter` to send it to the console -2. Copy the AI-generated code into your Quarto document and render the file (e.g., press Ctrl/Cmd + Shift + K). +CP/CR -3. Copy and paste the output from your Console here (CP/CR). -```{r california-median-age-1} +```{r california-median-age-4} question_text(NULL, answer(NULL, correct = TRUE), allow_retry = TRUE, @@ -529,14 +684,37 @@ question_text(NULL, ``` +### + +AI is your best friend! Professionals use AI to generate code and plot. You however, need to be careful as it can and will generate much extra code that you may not need. + +### Exercise 5 + +Now, tell your AI to set `geometry = FALSE` and only give the part to get the data into the variable. + +Put what it gives you in your code chunk and do `Ctrl/Cmd + Enter` to send it to the console + +CP/CR + +```{r california-median-age-5} +question_text(NULL, + answer(NULL, correct = TRUE), + allow_retry = TRUE, + try_again_button = "Edit Answer", + incorrect = NULL, + rows = 6) +``` + ### -Now, replace the code it gave you with this code: +Set geometry = TRUE in `get_acs()` or `get_decennial()` if you do not need spatial data. -```r -library(tidycensus) -library(tidyverse) +### Exercise 6 + +Here is our code. It is okay if your code is different. That will happen when using AI! +Replace your code with what it gave you using this code: +```` age_ca <- get_acs( geography = "county", variables = c(median_age = "B01002_001", population = "B01003_001"), @@ -544,32 +722,69 @@ age_ca <- get_acs( year = 2020, geometry = FALSE ) +```` + + +### + +`get_acs()` is your go-to for detailed annual demographic estimates from the American Community Survey. It returns both point estimates and margins of error (MOE) by default. + +### Exercise 7 + +Send our code to the console from the previous exercise. + +Now, type `age_ca` in the console. + +CP/CR the first few lines. + +```{r california-median-age-7} +question_text(NULL, + answer(NULL, correct = TRUE), + allow_retry = TRUE, + try_again_button = "Edit Answer", + incorrect = NULL, + rows = 3) ``` +### + +Helpful info for the next exercise: +`geom_col()` from `ggplot2`: Creates bar charts where bar heights correspond to values in the data. -Census Variable Codes: -Each variable has an identifier. For example, `"B19013_001"` stands for median household income. Use the tidycensus variable lookup to find codes. +### Exercise 8 + +Now, copy/paste those few lines into your AI. Tell it to use the `age_ca` data and make a bar plot showing median age by county. -### Exercise 2 -Now that you have the median age data for California counties, the goal is to create a bar plot showing median age by county. -In this exercise: +Put what it gives you in your code chunk and do `Ctrl/Cmd + Enter` to send it to the console -Ask an AI assistant to generate R code that: +CP/CR -Uses the `age_ca` data, -Filter the dataset to the 15 most populous counties -Create a bar chart (`geom_col()`) of median age by county -Order counties by population (descending) -Flip the axes using `coord_flip()` -Add informative labels and a title with `labs()` -Use `theme_minimal()` for a clean look +```{r california-median-age-8} +question_text(NULL, + answer(NULL, correct = TRUE), + allow_retry = TRUE, + try_again_button = "Edit Answer", + incorrect = NULL, + rows = 6) +``` -Copy the AI-generated code into your Quarto document and render it. -Copy and paste the console output here (CP/CR). +### -```{r california-median-age-2} +Annotate charts with `geom_text()` or `labs()` to add clarity about what each axis, facet, or fill represents—especially useful for public-facing work. + +### Exercise 9 + +Now we have a basic bar plot, but we have too much data points. + +Tell your AI to filter the dataset to the 15 most populous counties and add informative labels and a title with `labs()`. + +Put what it gives you in your code chunk and do `Ctrl/Cmd + Enter` to send it to the console + +CP/CR + +```{r california-median-age-9} question_text(NULL, answer(NULL, correct = TRUE), allow_retry = TRUE, @@ -580,19 +795,23 @@ question_text(NULL, ### -Now, replace the code it gave you with this code: +`theme_minimal()` from `ggplot2`: +Applies a clean, minimal theme to the plot for better readability. + +### Exercise 10 -```r +Here is our code. It is okay if your code is different. That will happen when using AI! +Replace your code with what it gave you using this code: + +```` age_ca_wide <- age_ca %>% select(NAME, variable, estimate) %>% pivot_wider(names_from = variable, values_from = estimate) -# Filter to the 15 most populous counties largest_ca <- age_ca_wide %>% arrange(desc(population)) %>% slice_head(n = 15) -# Plot median age for the biggest counties ggplot(largest_ca, aes(x = reorder(NAME, median_age), y = median_age)) + geom_col(fill = "#4daf4a") + coord_flip() + @@ -607,14 +826,10 @@ ggplot(largest_ca, aes(x = reorder(NAME, median_age), y = median_age)) + plot.title = element_text(size = 16, face = "bold"), axis.text.y = element_text(size = 10) ) -``` +```` ```{r} #| message: false -library(tidycensus) -library(tidyverse) - -# Get both median age and population for all California counties age_ca <- get_acs( geography = "county", variables = c(median_age = "B01002_001", population = "B01003_001"), @@ -623,17 +838,14 @@ age_ca <- get_acs( geometry = FALSE ) -# Convert to wide format for easier filtering age_ca_wide <- age_ca %>% select(NAME, variable, estimate) %>% pivot_wider(names_from = variable, values_from = estimate) -# Filter to the 15 most populous counties largest_ca <- age_ca_wide %>% arrange(desc(population)) %>% slice_head(n = 15) -# Plot median age for the biggest counties ggplot(largest_ca, aes(x = reorder(NAME, median_age), y = median_age)) + geom_col(fill = "#4daf4a") + coord_flip() + @@ -648,21 +860,22 @@ ggplot(largest_ca, aes(x = reorder(NAME, median_age), y = median_age)) + plot.title = element_text(size = 16, face = "bold"), axis.text.y = element_text(size = 10) ) - ``` +### + `coord_flip()` from ggplot2: Flips x and y axes, often used to make horizontal bar charts easier to read. -### Exercise 3 +### Exercise 11 1. In the Console, run the following command to display the last chunk of your `.qmd` file: CP/CR tutorial.helpers::show_file("CaliforniaAge.qmd", chunk = "last") -```{r california-median-age-3} +```{r california-median-age-11} question_text(NULL, answer(NULL, correct = TRUE), allow_retry = TRUE, @@ -673,12 +886,7 @@ question_text(NULL, ### -`geom_col()` from `ggplot2`: -Creates bar charts where bar heights correspond to values in the data. - -`theme_minimal()` from `ggplot2`: -Applies a clean, minimal theme to the plot for better readability. - +The `show_file()` function from tutorial.helpers is a convenient way to check the contents of files without leaving R. It helps confirm that your edits were saved properly. ```{r download-answers, child = system.file("child_documents/download_answers.Rmd", package = "tutorial.helpers")} From 663add26e1e8bc715b972fe18d9714c0c1a5a111 Mon Sep 17 00:00:00 2001 From: Ansh Pathak Date: Wed, 16 Jul 2025 20:17:28 -0500 Subject: [PATCH 2/2] added offline data --- inst/tutorials/99-overview/data/age_ca.rds | Bin 0 -> 9726 bytes inst/tutorials/99-overview/data/edu_ca.rds | Bin 0 -> 3368721 bytes inst/tutorials/99-overview/data/income_tx.rds | Bin 0 -> 1289232 bytes inst/tutorials/99-overview/tutorial.Rmd | 66 +++++++++++------- 4 files changed, 40 insertions(+), 26 deletions(-) create mode 100644 inst/tutorials/99-overview/data/age_ca.rds create mode 100644 inst/tutorials/99-overview/data/edu_ca.rds create mode 100644 inst/tutorials/99-overview/data/income_tx.rds diff --git a/inst/tutorials/99-overview/data/age_ca.rds b/inst/tutorials/99-overview/data/age_ca.rds new file mode 100644 index 0000000000000000000000000000000000000000..c4bb7c73f66ed0c1005d1f8a274a8f1d2ba17e63 GIT binary patch literal 9726 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