HateCrimes Tutorial HW

Author

A. Diaz-Nova

Hate Crimes Dataset - Based in NY from 2010 to 2016

# This dataset looks at all types of hate crimes in NY counties by the type of hate crime from 2010 to 2016.

# My caveat: (Define why it is a flawed in notes)

Flawed hate crime data collection - We should now how the data was collected first

# We find out a key piece of information. There is a possible bias in the data, from where? Well the FBI relies on local authorities to 'collect' and 'submit' (manifest evvictim_catence) but there are state laws that can complicate this procedure, aka they may gravitate towards certain groups

So now we know that there is possible bias in the dataset, what can we do with it?

library(tidyverse)
── Attaching core tidyverse packages ──────────────────────── tidyverse 2.0.0 ──
✔ dplyr     1.1.2     ✔ readr     2.1.4
✔ forcats   1.0.0     ✔ stringr   1.5.0
✔ ggplot2   3.4.3     ✔ tibble    3.2.1
✔ lubridate 1.9.2     ✔ tidyr     1.3.0
✔ 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(tinytex)
hatecrimes <- read_csv("hateCrimes2010.csv")
Rows: 423 Columns: 44
── Column specification ────────────────────────────────────────────────────────
Delimiter: ","
chr  (2): County, Crime Type
dbl (42): Year, Anti-Male, Anti-Female, Anti-Transgender, Anti-Gender Identi...

ℹ Use `spec()` to retrieve the full column specification for this data.
ℹ Specify the column types or set `show_col_types = FALSE` to quiet this message.

Clean up the data:

Make all headers lowercase and remove spaces (Note to self: Is this always the case for most datasets? To rephrase the above, what I am referring to is this the first step?)

# Some interest from the structure of the data. Take a look from the 44 variables, more specifically take note at the min/max values. 
names(hatecrimes) <- tolower(names(hatecrimes))
names(hatecrimes) <- gsub("","",names(hatecrimes))
head(hatecrimes)
# A tibble: 6 × 44
  county    year `crime type`       `anti-male` `anti-female` `anti-transgender`
  <chr>    <dbl> <chr>                    <dbl>         <dbl>              <dbl>
1 Albany    2016 Crimes Against Pe…           0             0                  0
2 Albany    2016 Property Crimes              0             0                  0
3 Allegany  2016 Property Crimes              0             0                  0
4 Bronx     2016 Crimes Against Pe…           0             0                  4
5 Bronx     2016 Property Crimes              0             0                  0
6 Broome    2016 Crimes Against Pe…           0             0                  0
# ℹ 38 more variables: `anti-gender identity expression` <dbl>,
#   `anti-age*` <dbl>, `anti-white` <dbl>, `anti-black` <dbl>,
#   `anti-american indian/alaskan native` <dbl>, `anti-asian` <dbl>,
#   `anti-native hawaiian/pacific islander` <dbl>,
#   `anti-multi-racial groups` <dbl>, `anti-other race` <dbl>,
#   `anti-jewish` <dbl>, `anti-catholic` <dbl>, `anti-protestant` <dbl>,
#   `anti-islamic (muslim)` <dbl>, `anti-multi-religious groups` <dbl>, …

What did we talk about? Look at the summary of the dataset, what interests you? From there select which data crimes to heavily focus on

summary(hatecrimes)
    county               year       crime type          anti-male       
 Length:423         Min.   :2010   Length:423         Min.   :0.000000  
 Class :character   1st Qu.:2011   Class :character   1st Qu.:0.000000  
 Mode  :character   Median :2013   Mode  :character   Median :0.000000  
                    Mean   :2013                      Mean   :0.007092  
                    3rd Qu.:2015                      3rd Qu.:0.000000  
                    Max.   :2016                      Max.   :1.000000  
  anti-female      anti-transgender  anti-gender identity expression
 Min.   :0.00000   Min.   :0.00000   Min.   :0.00000                
 1st Qu.:0.00000   1st Qu.:0.00000   1st Qu.:0.00000                
 Median :0.00000   Median :0.00000   Median :0.00000                
 Mean   :0.01655   Mean   :0.04728   Mean   :0.05674                
 3rd Qu.:0.00000   3rd Qu.:0.00000   3rd Qu.:0.00000                
 Max.   :1.00000   Max.   :5.00000   Max.   :3.00000                
   anti-age*         anti-white        anti-black    
 Min.   :0.00000   Min.   : 0.0000   Min.   : 0.000  
 1st Qu.:0.00000   1st Qu.: 0.0000   1st Qu.: 0.000  
 Median :0.00000   Median : 0.0000   Median : 1.000  
 Mean   :0.05201   Mean   : 0.3357   Mean   : 1.761  
 3rd Qu.:0.00000   3rd Qu.: 0.0000   3rd Qu.: 2.000  
 Max.   :9.00000   Max.   :11.0000   Max.   :18.000  
 anti-american indian/alaskan native   anti-asian    
 Min.   :0.000000                    Min.   :0.0000  
 1st Qu.:0.000000                    1st Qu.:0.0000  
 Median :0.000000                    Median :0.0000  
 Mean   :0.007092                    Mean   :0.1773  
 3rd Qu.:0.000000                    3rd Qu.:0.0000  
 Max.   :1.000000                    Max.   :8.0000  
 anti-native hawaiian/pacific islander anti-multi-racial groups anti-other race
 Min.   :0                             Min.   :0.00000          Min.   :0      
 1st Qu.:0                             1st Qu.:0.00000          1st Qu.:0      
 Median :0                             Median :0.00000          Median :0      
 Mean   :0                             Mean   :0.08511          Mean   :0      
 3rd Qu.:0                             3rd Qu.:0.00000          3rd Qu.:0      
 Max.   :0                             Max.   :3.00000          Max.   :0      
  anti-jewish     anti-catholic     anti-protestant   anti-islamic (muslim)
 Min.   : 0.000   Min.   : 0.0000   Min.   :0.00000   Min.   : 0.0000      
 1st Qu.: 0.000   1st Qu.: 0.0000   1st Qu.:0.00000   1st Qu.: 0.0000      
 Median : 0.000   Median : 0.0000   Median :0.00000   Median : 0.0000      
 Mean   : 3.981   Mean   : 0.2695   Mean   :0.02364   Mean   : 0.4704      
 3rd Qu.: 3.000   3rd Qu.: 0.0000   3rd Qu.:0.00000   3rd Qu.: 0.0000      
 Max.   :82.000   Max.   :12.0000   Max.   :1.00000   Max.   :10.0000      
 anti-multi-religious groups anti-atheism/agnosticism
 Min.   : 0.00000            Min.   :0               
 1st Qu.: 0.00000            1st Qu.:0               
 Median : 0.00000            Median :0               
 Mean   : 0.07565            Mean   :0               
 3rd Qu.: 0.00000            3rd Qu.:0               
 Max.   :10.00000            Max.   :0               
 anti-religious practice generally anti-other religion anti-buddhist
 Min.   :0.000000                  Min.   :0.000       Min.   :0    
 1st Qu.:0.000000                  1st Qu.:0.000       1st Qu.:0    
 Median :0.000000                  Median :0.000       Median :0    
 Mean   :0.007092                  Mean   :0.104       Mean   :0    
 3rd Qu.:0.000000                  3rd Qu.:0.000       3rd Qu.:0    
 Max.   :2.000000                  Max.   :4.000       Max.   :0    
 anti-eastern orthodox (greek, russian, etc.)   anti-hindu      
 Min.   :0.000000                             Min.   :0.000000  
 1st Qu.:0.000000                             1st Qu.:0.000000  
 Median :0.000000                             Median :0.000000  
 Mean   :0.002364                             Mean   :0.002364  
 3rd Qu.:0.000000                             3rd Qu.:0.000000  
 Max.   :1.000000                             Max.   :1.000000  
 anti-jehovahs witness  anti-mormon anti-other christian   anti-sikh
 Min.   :0             Min.   :0    Min.   :0.00000      Min.   :0  
 1st Qu.:0             1st Qu.:0    1st Qu.:0.00000      1st Qu.:0  
 Median :0             Median :0    Median :0.00000      Median :0  
 Mean   :0             Mean   :0    Mean   :0.01655      Mean   :0  
 3rd Qu.:0             3rd Qu.:0    3rd Qu.:0.00000      3rd Qu.:0  
 Max.   :0             Max.   :0    Max.   :3.00000      Max.   :0  
 anti-hispanic       anti-arab       anti-other ethnicity/national origin
 Min.   : 0.0000   Min.   :0.00000   Min.   : 0.0000                     
 1st Qu.: 0.0000   1st Qu.:0.00000   1st Qu.: 0.0000                     
 Median : 0.0000   Median :0.00000   Median : 0.0000                     
 Mean   : 0.3735   Mean   :0.06619   Mean   : 0.2837                     
 3rd Qu.: 0.0000   3rd Qu.:0.00000   3rd Qu.: 0.0000                     
 Max.   :17.0000   Max.   :2.00000   Max.   :19.0000                     
 anti-non-hispanic* anti-gay male    anti-gay female 
 Min.   :0          Min.   : 0.000   Min.   :0.0000  
 1st Qu.:0          1st Qu.: 0.000   1st Qu.:0.0000  
 Median :0          Median : 0.000   Median :0.0000  
 Mean   :0          Mean   : 1.499   Mean   :0.2411  
 3rd Qu.:0          3rd Qu.: 1.000   3rd Qu.:0.0000  
 Max.   :0          Max.   :36.000   Max.   :8.0000  
 anti-gay (male and female) anti-heterosexual  anti-bisexual     
 Min.   :0.0000             Min.   :0.000000   Min.   :0.000000  
 1st Qu.:0.0000             1st Qu.:0.000000   1st Qu.:0.000000  
 Median :0.0000             Median :0.000000   Median :0.000000  
 Mean   :0.1017             Mean   :0.002364   Mean   :0.004728  
 3rd Qu.:0.0000             3rd Qu.:0.000000   3rd Qu.:0.000000  
 Max.   :4.0000             Max.   :1.000000   Max.   :1.000000  
 anti-physical disability anti-mental disability total incidents 
 Min.   :0.00000          Min.   :0.000000       Min.   :  1.00  
 1st Qu.:0.00000          1st Qu.:0.000000       1st Qu.:  1.00  
 Median :0.00000          Median :0.000000       Median :  3.00  
 Mean   :0.01182          Mean   :0.009456       Mean   : 10.09  
 3rd Qu.:0.00000          3rd Qu.:0.000000       3rd Qu.: 10.00  
 Max.   :1.00000          Max.   :1.000000       Max.   :101.00  
 total victims    total offenders 
 Min.   :  1.00   Min.   :  1.00  
 1st Qu.:  1.00   1st Qu.:  1.00  
 Median :  3.00   Median :  3.00  
 Mean   : 10.48   Mean   : 11.77  
 3rd Qu.: 10.00   3rd Qu.: 11.00  
 Max.   :106.00   Max.   :113.00  

I choose 6 different types of hype crimes that had either a max number of 3 or more. To see if there is some variance by selecting a smaller max.

hatecrimes2 <- hatecrimes |>
  select(county, year, 'anti-hispanic', 'anti-other ethnicity/national origin', 'anti-other christian', 'anti-other religion', 'anti-multi-religious groups', 'anti-islamic (muslim)') |>
  group_by(county, year)
head(hatecrimes2)
# A tibble: 6 × 8
# Groups:   county, year [4]
  county    year `anti-hispanic` anti-other ethnicity/n…¹ `anti-other christian`
  <chr>    <dbl>           <dbl>                    <dbl>                  <dbl>
1 Albany    2016               0                        0                      0
2 Albany    2016               0                        0                      0
3 Allegany  2016               0                        0                      0
4 Bronx     2016               0                        0                      0
5 Bronx     2016               0                        0                      0
6 Broome    2016               0                        0                      0
# ℹ abbreviated name: ¹​`anti-other ethnicity/national origin`
# ℹ 3 more variables: `anti-other religion` <dbl>,
#   `anti-multi-religious groups` <dbl>, `anti-islamic (muslim)` <dbl>

Check the dimensions and the summary to make sure no missing values

# That also means checking the dimensions to count how many variables remain
dim(hatecrimes2)
[1] 423   8
# There are currently 8 variables with 423 rows
summary(hatecrimes2)
    county               year      anti-hispanic    
 Length:423         Min.   :2010   Min.   : 0.0000  
 Class :character   1st Qu.:2011   1st Qu.: 0.0000  
 Mode  :character   Median :2013   Median : 0.0000  
                    Mean   :2013   Mean   : 0.3735  
                    3rd Qu.:2015   3rd Qu.: 0.0000  
                    Max.   :2016   Max.   :17.0000  
 anti-other ethnicity/national origin anti-other christian anti-other religion
 Min.   : 0.0000                      Min.   :0.00000      Min.   :0.000      
 1st Qu.: 0.0000                      1st Qu.:0.00000      1st Qu.:0.000      
 Median : 0.0000                      Median :0.00000      Median :0.000      
 Mean   : 0.2837                      Mean   :0.01655      Mean   :0.104      
 3rd Qu.: 0.0000                      3rd Qu.:0.00000      3rd Qu.:0.000      
 Max.   :19.0000                      Max.   :3.00000      Max.   :4.000      
 anti-multi-religious groups anti-islamic (muslim)
 Min.   : 0.00000            Min.   : 0.0000      
 1st Qu.: 0.00000            1st Qu.: 0.0000      
 Median : 0.00000            Median : 0.0000      
 Mean   : 0.07565            Mean   : 0.4704      
 3rd Qu.: 0.00000            3rd Qu.: 0.0000      
 Max.   :10.00000            Max.   :10.0000      

Convert from wide to long format, let’s get into it

# It will take each column's hate crime type and combine them all into one column, which we will call victim_cat. As a result, each cell count will go into the new column called crimecount.
hatelong <- hatecrimes2 |>
  pivot_longer(cols = 3:8,
               names_to = "victim_cat",
               values_to = "crimecount")

Use the long format to create a facet plot, only after converting

hatecrimplot <- hatelong |> 
  ggplot(aes(year, crimecount)) +
  geom_point() +
  aes(color = victim_cat) +
  facet_wrap(~victim_cat)
hatecrimplot

Look deeper into crimes against against hispanics, islamic folk (muslims), and other ethnicity/national origin. (Note to self: This is really cool, the coding part not the crimes)

# From above we see that only three stood out on the criteria of higher raates of offenses reported
hatenew <- hatelong |>
  filter(victim_cat %in% c("anti-hispanic","anti-islamic (muslim)", "anti-other ethnicity/national origin")) |>
  group_by(year, county) |> 
  arrange(desc(crimecount))
hatenew
# A tibble: 1,269 × 4
# Groups:   year, county [277]
   county    year victim_cat                           crimecount
   <chr>    <dbl> <chr>                                     <dbl>
 1 Queens    2016 anti-other ethnicity/national origin         19
 2 Richmond  2010 anti-hispanic                                17
 3 Kings     2014 anti-islamic (muslim)                        10
 4 Kings     2014 anti-other ethnicity/national origin         10
 5 Suffolk   2010 anti-hispanic                                10
 6 Kings     2016 anti-islamic (muslim)                         9
 7 Kings     2015 anti-islamic (muslim)                         7
 8 Queens    2012 anti-islamic (muslim)                         7
 9 Suffolk   2012 anti-hispanic                                 7
10 Kings     2010 anti-islamic (muslim)                         7
# ℹ 1,259 more rows

Plot these three types of hate crimes together

# This is crucial, use position = "dodge" rather than "identity" because it makes side-by-side bars rather than stacking them.
plot2 <- hatenew |> 
  ggplot() +
  geom_bar(aes(x=year, y=crimecount, fill= victim_cat), position = "dodge", stat = "identity") + 
  labs(fill = "Hate Crime Type",
       y = "Number of Hate Crime Incidents",
       title = "Hate Crime Type in NY Counties Between 2010-2016",
       caption = "Source: NY State Division of Criminal Justice Services")
plot2

# We can see two spikes in crimes but within different years and crime types. Hispanics and other ethnicity/national origin dealt with over 15 hate crime incidents but the former in 2010 and the latter in 2016. Hate crimes for hispanics as we can see are plummeting throughout the years, but crimes against other ethnicity/national origin persists with an upward trend

What about the counties?

# This will be the very last thing to explore. So instead of years as the x value it will be in favor of counties
plot3 <- hatenew |>
  ggplot() +
  geom_bar(aes(x = county, y = crimecount, fill = victim_cat), position = "dodge", stat = "identity") +
  labs(fill = "Number of Hate Crime Incidents",
       title = "Hate Crime Type in NY Counties Between 2010-2016",
       caption = "Source: NY State Division of Criminal Justice Services")
plot3

Well there are too many counties in this bar graph. To make sense of it we will only look into at the five counties with the highest number of incidents

counties <- hatenew |>
  group_by(year, county) |>
  summarize(sum = sum(crimecount)) |>
  arrange(desc(sum))
`summarise()` has grouped output by 'year'. You can override using the
`.groups` argument.
counties
# A tibble: 277 × 3
# Groups:   year [7]
    year county     sum
   <dbl> <chr>    <dbl>
 1  2016 Queens      28
 2  2010 Richmond    24
 3  2014 Kings       24
 4  2012 Queens      16
 5  2012 Suffolk     16
 6  2016 Kings       15
 7  2010 Suffolk     14
 8  2010 New York    13
 9  2015 Kings       13
10  2010 Kings       11
# ℹ 267 more rows

All we will be doing is changing the group_by function with (county) then slice_max function to list the top 5

counties2 <- hatenew |>
  group_by(county)|>
  summarize(sum = sum(crimecount)) |>
  slice_max(order_by = sum, n=5)
counties2
# A tibble: 5 × 2
  county     sum
  <chr>    <dbl>
1 Kings       88
2 Queens      79
3 New York    70
4 Suffolk     54
5 Richmond    39
## At last we create a bargraph based of the data above. IMPORTANT: Only for the top five counties in 2012 with the highest incidents of hate-crimes. (Note to self: Fall in love with labs, that function will save you time)
plot4 <- hatenew |>
  filter(county %in% c("Kings", "Queens", "New York", "Suffolk", "Richmond")) |>
  ggplot() +
  geom_bar(aes(x=county, y=crimecount, fill = victim_cat),
      position = "dodge", stat = "identity") +
  labs(y = "Number of Hate Crime Incidents",
       title = "5 Counties in NY with Highest Incidents of Hate Crimes",
       subtitle = "Between 2010-2016", 
       fill = "Hate Crime Type",
      caption = "Source: NY State Division of Criminal Justice Services")
plot4

How would this vary if calculations were say affected based on the same criteria but per year by population densities?

#Bring in census data for population of NY counties
nypop <- read_csv("newyorkpopulation.csv")
Rows: 62 Columns: 8
── Column specification ────────────────────────────────────────────────────────
Delimiter: ","
chr (1): Geography
dbl (7): 2010, 2011, 2012, 2013, 2014, 2015, 2016

ℹ Use `spec()` to retrieve the full column specification for this data.
ℹ Specify the column types or set `show_col_types = FALSE` to quiet this message.

Clean the county name to match the other dataset. Basically switch “Geography for”County”

nypop$Geography <- gsub(" , New York", "", nypop$Geography)
nypop$Geography <- gsub("County", "", nypop$Geography)
nypoplong <- nypop |>
  rename(county = Geography) |>
  gather("year", "population", 2:8) 
nypoplong$year <- as.double(nypoplong$year)
head(nypoplong)
# A tibble: 6 × 3
  county                  year population
  <chr>                  <dbl>      <dbl>
1 Albany , New York       2010     304078
2 Allegany , New York     2010      48949
3 Bronx , New York        2010    1388240
4 Broome , New York       2010     200469
5 Cattaraugus , New York  2010      80249
6 Cayuga , New York       2010      79844

This is still important, remember we are focused on 2012

# We are looking at this because 2012 had the highest counts of hate crimes. More cleaning of the dataset
nypoplong12 <- nypoplong |>
  filter(year == 2012) |>
  arrange(desc(population)) |>
  head(10)
nypoplong12$county<-gsub(" , New York","",nypoplong12$county)
nypoplong12
# A tibble: 10 × 3
   county       year population
   <chr>       <dbl>      <dbl>
 1 Kings        2012    2572282
 2 Queens       2012    2278024
 3 New York     2012    1625121
 4 Suffolk      2012    1499382
 5 Bronx        2012    1414774
 6 Nassau       2012    1350748
 7 Westchester  2012     961073
 8 Erie         2012     920792
 9 Monroe       2012     748947
10 Richmond     2012     470978
# We are going to recall the total hate crime counts for each: Kings    88      Queens  79      New York    70      Suffolk 54      Richmond    39  
# Filter hate crimes just for 2012 as well
counties12 <- counties |>
  filter(year == 2012) |>
  arrange(desc(sum)) 
counties12
# A tibble: 41 × 3
# Groups:   year [1]
    year county     sum
   <dbl> <chr>    <dbl>
 1  2012 Queens      16
 2  2012 Suffolk     16
 3  2012 New York    10
 4  2012 Richmond     6
 5  2012 Kings        5
 6  2012 Nassau       5
 7  2012 Bronx        2
 8  2012 Erie         2
 9  2012 Albany       1
10  2012 Lewis        1
# ℹ 31 more rows

Join the Hate Crimes data with the NY population data to match 2012

datajoin <- counties12 |>
  full_join(nypoplong12, by=c("county", "year"))
datajoin
# A tibble: 41 × 4
# Groups:   year [1]
    year county     sum population
   <dbl> <chr>    <dbl>      <dbl>
 1  2012 Queens      16    2278024
 2  2012 Suffolk     16    1499382
 3  2012 New York    10    1625121
 4  2012 Richmond     6     470978
 5  2012 Kings        5    2572282
 6  2012 Nassau       5    1350748
 7  2012 Bronx        2    1414774
 8  2012 Erie         2     920792
 9  2012 Albany       1         NA
10  2012 Lewis        1         NA
# ℹ 31 more rows

Calculate the rate of incidents per 100,000. Then arrange in descending order

datajoinrate <- datajoin |>
  mutate(rate = sum/population*100000) |>
  arrange(desc(rate))
datajoinrate
# A tibble: 41 × 5
# Groups:   year [1]
    year county        sum population  rate
   <dbl> <chr>       <dbl>      <dbl> <dbl>
 1  2012 Richmond        6     470978 1.27 
 2  2012 Suffolk        16    1499382 1.07 
 3  2012 Queens         16    2278024 0.702
 4  2012 New York       10    1625121 0.615
 5  2012 Nassau          5    1350748 0.370
 6  2012 Erie            2     920792 0.217
 7  2012 Kings           5    2572282 0.194
 8  2012 Bronx           2    1414774 0.141
 9  2012 Westchester     1     961073 0.104
10  2012 Monroe          0     748947 0    
# ℹ 31 more rows
dt <- datajoinrate[,c("county","rate")]
dt
# A tibble: 41 × 2
   county       rate
   <chr>       <dbl>
 1 Richmond    1.27 
 2 Suffolk     1.07 
 3 Queens      0.702
 4 New York    0.615
 5 Nassau      0.370
 6 Erie        0.217
 7 Kings       0.194
 8 Bronx       0.141
 9 Westchester 0.104
10 Monroe      0    
# ℹ 31 more rows

Follow up, now we will aggregaye some of the categories

aggregategroups <- hatecrimes |>
  pivot_longer(
    cols = 4:44,
    names_to = "victim_cat",
    values_to = "crimecount"
  )
unique(aggregategroups$victim_cat)
 [1] "anti-male"                                   
 [2] "anti-female"                                 
 [3] "anti-transgender"                            
 [4] "anti-gender identity expression"             
 [5] "anti-age*"                                   
 [6] "anti-white"                                  
 [7] "anti-black"                                  
 [8] "anti-american indian/alaskan native"         
 [9] "anti-asian"                                  
[10] "anti-native hawaiian/pacific islander"       
[11] "anti-multi-racial groups"                    
[12] "anti-other race"                             
[13] "anti-jewish"                                 
[14] "anti-catholic"                               
[15] "anti-protestant"                             
[16] "anti-islamic (muslim)"                       
[17] "anti-multi-religious groups"                 
[18] "anti-atheism/agnosticism"                    
[19] "anti-religious practice generally"           
[20] "anti-other religion"                         
[21] "anti-buddhist"                               
[22] "anti-eastern orthodox (greek, russian, etc.)"
[23] "anti-hindu"                                  
[24] "anti-jehovahs witness"                       
[25] "anti-mormon"                                 
[26] "anti-other christian"                        
[27] "anti-sikh"                                   
[28] "anti-hispanic"                               
[29] "anti-arab"                                   
[30] "anti-other ethnicity/national origin"        
[31] "anti-non-hispanic*"                          
[32] "anti-gay male"                               
[33] "anti-gay female"                             
[34] "anti-gay (male and female)"                  
[35] "anti-heterosexual"                           
[36] "anti-bisexual"                               
[37] "anti-physical disability"                    
[38] "anti-mental disability"                      
[39] "total incidents"                             
[40] "total victims"                               
[41] "total offenders"                             
aggregategroups <- aggregategroups |>
  mutate(group = case_when(
    victim_cat %in% c("anti-transgender", "anti-gayfemale", "anti-gendervictim_catendityexpression", "anti-gaymale", "anti-gay(maleandfemale", "anti-bisexual") ~ "anti-lgbtq",
    victim_cat %in% c("anti-multi-racialgroups", "anti-jewish", "anti-protestant", "anti-multi-religousgroups", "anti-religiouspracticegenerally", "anti-buddhist", "anti-hindu", "anti-mormon", "anti-sikh", "anti-catholic", "anti-islamic(muslim)", "anti-atheism/agnosticism", "anti-otherreligion", "anti-easternorthodox(greek,russian,etc.)", "anti-jehovahswitness", "anti-otherchristian") ~ "anti-religion", 
    victim_cat %in% c("anti-asian", "anti-arab", "anti-non-hispanic", "anti-white", "anti-americanindian/alaskannative", "anti-nativehawaiian/pacificislander", "anti-otherrace", "anti-hispanic", "anti-otherethnicity/nationalorigin") ~ "anti-ethnicity",
    victim_cat %in% c("anti-physicaldisability", "anti-mentaldisability") ~ "anti-disability",
    victim_cat %in% c("anti-female", "anti-male") ~ "anti-gender",
    TRUE ~ "others"))
aggregategroups
# A tibble: 17,343 × 6
   county  year `crime type`           victim_cat               crimecount group
   <chr>  <dbl> <chr>                  <chr>                         <dbl> <chr>
 1 Albany  2016 Crimes Against Persons anti-male                         0 anti…
 2 Albany  2016 Crimes Against Persons anti-female                       0 anti…
 3 Albany  2016 Crimes Against Persons anti-transgender                  0 anti…
 4 Albany  2016 Crimes Against Persons anti-gender identity ex…          0 othe…
 5 Albany  2016 Crimes Against Persons anti-age*                         0 othe…
 6 Albany  2016 Crimes Against Persons anti-white                        0 anti…
 7 Albany  2016 Crimes Against Persons anti-black                        1 othe…
 8 Albany  2016 Crimes Against Persons anti-american indian/al…          0 othe…
 9 Albany  2016 Crimes Against Persons anti-asian                        0 anti…
10 Albany  2016 Crimes Against Persons anti-native hawaiian/pa…          0 othe…
# ℹ 17,333 more rows

Or create a subset with just LGBTQ

lgbtq <- hatecrimes |>
  pivot_longer(
      cols = 4:44,
      names_to = "victim_cat",
      values_to = "crimecount") |>
filter(victim_cat %in% c("anti-transgender", "anti-gayfemale", "anti-gendervictim_catendityexpression", "anti-gaymale", "anti-gay(maleandfemale", "anti-bisexual"))
lgbtq
# A tibble: 846 × 5
   county    year `crime type`           victim_cat       crimecount
   <chr>    <dbl> <chr>                  <chr>                 <dbl>
 1 Albany    2016 Crimes Against Persons anti-transgender          0
 2 Albany    2016 Crimes Against Persons anti-bisexual             0
 3 Albany    2016 Property Crimes        anti-transgender          0
 4 Albany    2016 Property Crimes        anti-bisexual             0
 5 Allegany  2016 Property Crimes        anti-transgender          0
 6 Allegany  2016 Property Crimes        anti-bisexual             0
 7 Bronx     2016 Crimes Against Persons anti-transgender          4
 8 Bronx     2016 Crimes Against Persons anti-bisexual             0
 9 Bronx     2016 Property Crimes        anti-transgender          0
10 Bronx     2016 Property Crimes        anti-bisexual             0
# ℹ 836 more rows

So what does all of this mean?

# Important Findings:
# 1) As you have mentioned before we started into cleaning, plotting, and so on, what as we did as an activity was flawed date due to possible bias. On a more positive note, we can track trends based on what groups we believe are of suspicion of prejudice and so forth. 
# 2) Two unique case studies, one for gender specificity in regards of what time periods we believe deserves more research. That said, the same could be done for religion and who knows that conclusive answers we get
# 3) What about the hate crimes that aren't reported, or perhaps in another country? Stuff like that, crime is happening all the time it should be in our interests to find some answer to certain questions.