GSS_Data

library(tidyverse)
Warning: package 'tidyverse' was built under R version 4.2.3
Warning: package 'ggplot2' was built under R version 4.2.3
Warning: package 'tibble' was built under R version 4.2.3
Warning: package 'tidyr' was built under R version 4.2.3
Warning: package 'readr' was built under R version 4.2.3
Warning: package 'purrr' was built under R version 4.2.3
Warning: package 'dplyr' was built under R version 4.2.3
Warning: package 'stringr' was built under R version 4.2.3
Warning: package 'forcats' was built under R version 4.2.3
Warning: package 'lubridate' was built under R version 4.2.3
── Attaching core tidyverse packages ──────────────────────── tidyverse 2.0.0 ──
✔ dplyr     1.1.4     ✔ readr     2.1.5
✔ forcats   1.0.0     ✔ stringr   1.5.1
✔ ggplot2   3.4.4     ✔ tibble    3.2.1
✔ lubridate 1.9.3     ✔ tidyr     1.3.1
✔ purrr     1.0.2     
── Conflicts ────────────────────────────────────────── tidyverse_conflicts() ──
✖ dplyr::filter() masks stats::filter()
✖ dplyr::lag()    masks stats::lag()
ℹ Use the conflicted package (<http://conflicted.r-lib.org/>) to force all conflicts to become errors
library(readxl)
Warning: package 'readxl' was built under R version 4.2.3
library(plotly)
Warning: package 'plotly' was built under R version 4.2.3

Attaching package: 'plotly'

The following object is masked from 'package:ggplot2':

    last_plot

The following object is masked from 'package:stats':

    filter

The following object is masked from 'package:graphics':

    layout
survey <- read_excel("GSS.xlsx")

##Question 1

I performed a quick check to remove the extra variables, and created a histogram for race.

survey |> 
  count(race)
# A tibble: 4 × 2
  race                  n
  <chr>             <int>
1 .i:  Inapplicable    53
2 Black               975
3 Other               579
4 White              4702
survey |> 
  mutate(race = as_factor(race)) |> 
  
  mutate(race = fct_recode(race,
                          NULL = ".i:  Inapplicable")) |> 

  drop_na(race) |> 
  
  mutate(race = fct_infreq(race)) |> 
  
  plot_ly(x = ~race) |> 
  add_histogram()

##Question 2

Same process as age, this time for the variable “spanking”.

survey |> 
  count(spanking)
# A tibble: 8 × 2
  spanking                           n
  <chr>                          <int>
1 .d:  Do not Know/Cannot Choose    29
2 .i:  Inapplicable               3025
3 .n:  No answer                     5
4 .s:  Skipped on Web                7
5 AGREE                           1274
6 DISAGREE                         810
7 STRONGLY AGREE                   706
8 STRONGLY DISAGREE                453
survey |> 
  mutate(spanking = as_factor(spanking)) |> 
  
  mutate(spanking = fct_recode(spanking,
                          NULL = ".d:  Do not Know/Cannot Choose",
                          NULL = ".i:  Inapplicable",
                          NULL = ".n:  No answer",
                          NULL = ".s:  Skipped on Web")) |> 

  drop_na(spanking) |> 
  
  mutate(spanking = fct_infreq(spanking)) |> 
  
  plot_ly(x = ~spanking) |> 
  add_histogram()

##Question 3

I combined the code for both “age” and “spanking” into a single box plot, with the variable “spanking” first being transformed into numerical data (1 being Strongly Disagree, 4 being Strongly Agree).

survey |> 
  mutate(spanking = as_factor(spanking)) |> 
  
  mutate(spanking = fct_recode(spanking,
                          NULL = ".d:  Do not Know/Cannot Choose",
                          NULL = ".i:  Inapplicable",
                          NULL = ".n:  No answer",
                          NULL = ".s:  Skipped on Web")) |> 

  mutate(spanking = fct_relevel(spanking,
                              c("STRONGLY DISAGREE",
                                "DISAGREE",
                                "AGREE",
                                "STRONGLY AGREE"))) |> 
  drop_na(spanking) |> 
  
  mutate(spanking = as.numeric(spanking)) |> 
  
  mutate(race = as_factor(race)) |> 
  
  mutate(race = fct_recode(race,
                          NULL = ".i:  Inapplicable")) |> 

  drop_na(race) |> 
  
  mutate(race = fct_infreq(race)) |> 
  
  plot_ly(x = ~race, y = ~spanking) |> 
  add_boxplot()

##Question 4

I had a hard time with this question at first, but after checking the code, I realized I wrote “8 or more” = “8” which is in the opposite order. I finally found the solution by looking back at the original example and some help online, but it costed me a lot of time.

survey |>
  count(childs)
# A tibble: 11 × 2
   childs                             n
   <chr>                          <int>
 1 .d:  Do not Know/Cannot Choose     5
 2 .i:  Inapplicable                 11
 3 0                               1906
 4 1                               1014
 5 2                               1571
 6 3                               1000
 7 4                                430
 8 5                                169
 9 6                                 81
10 7                                 47
11 8 or more                         75
survey |> 
  mutate(childs = fct_recode(childs,
                          "8" = "8 or more",
                          NULL = ".d:  Do not Know/Cannot Choose",
                          NULL = ".i:  Inapplicable")) |> 
  drop_na(childs) |> 
  
  mutate(childs = as.numeric(as.character(childs))) |>
  
  plot_ly(x = ~childs) |> 
  add_histogram()

##Question 5

With the issue resolved, I combined the data for the “spanking” and “childs” variables to form a box plot similar to question 3.

survey |> 
  mutate(spanking = as_factor(spanking)) |> 
  
  mutate(spanking = fct_recode(spanking,
                          NULL = ".d:  Do not Know/Cannot Choose",
                          NULL = ".i:  Inapplicable",
                          NULL = ".n:  No answer",
                          NULL = ".s:  Skipped on Web")) |> 
  drop_na(spanking) |> 
  
  mutate(spanking = fct_infreq(spanking)) |> 
  
  mutate(spanking = as_factor(spanking)) |> 
  
  mutate(childs = fct_recode(childs,
                          "8" = "8 or more",
                          NULL = ".d:  Do not Know/Cannot Choose",
                          NULL = ".i:  Inapplicable")) |> 
  drop_na(childs) |> 
  
  mutate(childs = as.numeric(as.character(childs))) |> 
  
  plot_ly(x = ~spanking, y = ~childs) |> 
  add_boxplot()

##Question 6

The variable “hapmar” was treated similarly to questions 1 and 2.

survey |>
  count(hapmar)
# A tibble: 7 × 2
  hapmar                             n
  <chr>                          <int>
1 .d:  Do not Know/Cannot Choose     2
2 .i:  Inapplicable               4234
3 .n:  No answer                    12
4 .s:  Skipped on Web                3
5 NOT TOO HAPPY                     90
6 PRETTY HAPPY                     717
7 VERY HAPPY                      1251
survey |> 
  mutate(hapmar = as_factor(hapmar)) |> 
  
  mutate(hapmar = fct_recode(hapmar,
                          NULL = ".d:  Do not Know/Cannot Choose",
                          NULL = ".i:  Inapplicable",
                          NULL = ".n:  No answer",
                          NULL = ".s:  Skipped on Web")) |> 
  drop_na(hapmar) |> 
  
  mutate(hapmar = fct_infreq(hapmar)) |> 
  
  plot_ly(x = ~hapmar) |> 
  add_histogram()

##Question 7

Same as above, but for the variable “class_” and reordered from lower to upper class. (I renamed the variable to make it more simple.)

survey |>
  count(class_)
# A tibble: 7 × 2
  class_                             n
  <chr>                          <int>
1 .d:  Do not Know/Cannot Choose    36
2 .n:  No answer                    12
3 .s:  Skipped on Web                7
4 Lower class                      547
5 Middle class                    2749
6 Upper class                      256
7 Working class                   2702
survey |> 
  mutate(class = as_factor(class_)) |> 
  
  mutate(class = fct_recode(class,
                          NULL = ".d:  Do not Know/Cannot Choose",
                          NULL = ".n:  No answer",
                          NULL = ".s:  Skipped on Web")) |> 
  
  mutate(class = fct_relevel(class,
                              c("Lower class",
                                "Working class",
                                "Middle class",
                                "Upper class"))) |> 
  drop_na(class) |> 
  
  plot_ly(x = ~class) |> 
  add_histogram()

##Question 8

I combined the variables “class” and “hapmar” to create a histogram, with “hapmar” separating each class by color.

survey |> 
  mutate(class = as_factor(class_)) |> 
  
  mutate(class = fct_recode(class,
                          NULL = ".d:  Do not Know/Cannot Choose",
                          NULL = ".n:  No answer",
                          NULL = ".s:  Skipped on Web")) |> 
  
  mutate(class = fct_relevel(class,
                              c("Lower class",
                                "Working class",
                                "Middle class",
                                "Upper class"))) |> 
  drop_na(class) |> 
  
  mutate(hapmar = as_factor(hapmar)) |> 
  
  mutate(hapmar = fct_recode(hapmar,
                          NULL = ".d:  Do not Know/Cannot Choose",
                          NULL = ".i:  Inapplicable",
                          NULL = ".n:  No answer",
                          NULL = ".s:  Skipped on Web")) |> 
  drop_na(hapmar) |> 
  
  mutate(hapmar = fct_infreq(hapmar)) |> 
  
  plot_ly(x = ~class, color = ~hapmar) |> 
  add_histogram()

##Question 9

I didn’t know if there was a way to collapse groups of numbers, so I typed them out individually. Please let me know if there was an easier way to do this.

survey |>
  count(age)
# A tibble: 73 × 2
   age                n
   <chr>          <int>
 1 .n:  No answer   222
 2 18                26
 3 19                54
 4 20                80
 5 21                86
 6 22                92
 7 23               121
 8 24               103
 9 25               106
10 26               112
# ℹ 63 more rows
survey |> 
  mutate(age = as_factor(age)) |> 
  
  mutate(age = fct_recode(age,
                          NULL = ".n:  No answer")) |> 
  
  mutate(age = fct_collapse(age,
                              "Under 30" = c(18,19,20,21,22,23,24,25,26,27,28,29),
                              "30s" = c(30,31,32,33,34,35,36,37,38,39),
                              "40s" = c(40,41,42,43,44,45,46,47,48,49),
                              "50s" = c(50,51,52,53,54,55,56,57,58,59),
                              "60s" = c(60,61,62,63,64,65,66,67,68,69),
                              "70s" = c(70,71,72,73,74,75,76,77,78,79),
                              "80 and up" = c(80,81,82,83,84,85,86,87,88,"89 or older"))) |>
  drop_na(age) |> 
  
  plot_ly(x = ~age) |> 
  add_histogram()

##Question 10

Lastly, I combined the variables “age” and “hapmar” to create a heatmap.

survey |> 
  mutate(age = as_factor(age)) |> 
  
  mutate(age = fct_recode(age,
                          NULL = ".n:  No answer")) |> 
  
  mutate(age = fct_collapse(age,
                              "Under 30" = c(18,19,20,21,22,23,24,25,26,27,28,29),
                              "30s" = c(30,31,32,33,34,35,36,37,38,39),
                              "40s" = c(40,41,42,43,44,45,46,47,48,49),
                              "50s" = c(50,51,52,53,54,55,56,57,58,59),
                              "60s" = c(60,61,62,63,64,65,66,67,68,69),
                              "70s" = c(70,71,72,73,74,75,76,77,78,79),
                              "80 and up" = c(80,81,82,83,84,85,86,87,88,"89 or older"))) |>
  drop_na(age) |> 
  
  mutate(hapmar = as_factor(hapmar)) |> 
  
  mutate(hapmar = fct_recode(hapmar,
                          NULL = ".d:  Do not Know/Cannot Choose",
                          NULL = ".i:  Inapplicable",
                          NULL = ".n:  No answer",
                          NULL = ".s:  Skipped on Web")) |> 
  drop_na(hapmar) |> 
  
  mutate(hapmar = fct_infreq(hapmar)) |> 
  
  plot_ly(x = ~hapmar, y = ~age) |> 
  add_histogram2d()