Для агрегирования по фразам, как в первоначальном вопросе, я сделал
anti <-
hate_crime %>%
filter(DATA_YEAR %in% c("2009", "2017")) %>%
mutate(
ANTI_WHITE = grepl("Anti-White", BIAS_DESC),
ANTI_BLACK = grepl("Anti-Black", BIAS_DESC),
ANTI_HISPANIC = grepl("Anti-Hispanic", BIAS_DESC)
) %>%
select(DATA_YEAR, starts_with("ANTI"))
Затем я создал счетчики каждого вхождения с group_by()
и summarize_all()
(отметив, что sum()
логического vector - это число TRUE
вхождений), которое использовалось для создания «аккуратной» сводки pivot_longer()
anti %>%
group_by(DATA_YEAR) %>%
summarize_all(~ sum(.)) %>%
tidyr::pivot_longer(starts_with("ANTI"), "BIAS", values_to = "COUNT")
В результате получилось что-то вроде (были ошибки при импорте данных с read_csv()
, которые я не исследовал)
# A tibble: 6 x 3
DATA_YEAR BIAS COUNT
<dbl> <chr> <int>
1 2009 ANTI_WHITE 539
2 2009 ANTI_BLACK 2300
3 2009 ANTI_HISPANIC 486
4 2017 ANTI_WHITE 722
5 2017 ANTI_BLACK 2101
6 2017 ANTI_HISPANIC 444
Визуализация выглядит как второй, отдельный вопрос.
Код можно сделать немного проще, определив функцию
n_with_bias <- function(x, bias)
sum(grepl(bias, x))
а затем избегая необходимости отдельно изменять данные
hate_crime %>%
filter(DATA_YEAR %in% c("2009", "2017")) %>%
group_by(DATA_YEAR) %>%
summarize(
ANTI_WHITE = n_with_bias(BIAS_DESC, "Anti-White"),
ANTI_BLACK = n_with_bias(BIAS_DESC, "Anti-Black"),
ANTI_HISPANIC = n_with_bias(BIAS_DESC, "Anti-Hispanic")
) %>%
tidyr::pivot_longer(starts_with("ANTI"), names_to = "BIAS", values_to = "N")
С другой стороны, базовый подход R может создать векторы для интересующих лет и всех предубеждений (использование strsplit()
для изоляции компонентов составные смещения)
years <- c("2009", "2017")
biases <- unique(unlist(strsplit(hate_crime$BIAS_DESC, ";")))
, затем создайте векторы смещений в каждом интересующем году
bias_by_year <- split(hate_crime$BIAS_DESC, hate_crime$DATA_YEAR)[years]
и выполняйте итерации в течение каждого года и смещения (вложенные итерации могут быть неэффективными при больших , е g, 10000, количество элементов, но здесь это не имеет значения)
sapply(bias_by_year, function(bias) sapply(biases, n_with_bias, x = bias))
В результате получается класс c data.frame со всеми отклонениями в каждом году
2009 2017
Anti-Black or African American 2300 2101
Anti-White 539 722
Anti-Jewish 932 983
Anti-Arab 0 106
Anti-Protestant 38 42
Anti-Other Religion 111 85
Anti-Islamic (Muslim) 0 0
Anti-Gay (Male) 0 0
Anti-Asian 128 133
Anti-Catholic 52 72
Anti-Heterosexual 21 33
Anti-Hispanic or Latino 486 444
Anti-Other Race/Ethnicity/Ancestry 296 280
Anti-Multiple Religions, Group 48 52
Anti-Multiple Races, Group 180 202
Anti-Lesbian (Female) 0 0
Anti-Lesbian, Gay, Bisexual, or Transgender (Mixed Group) 0 0
Anti-American Indian or Alaska Native 68 244
Anti-Atheism/Agnosticism 10 6
Anti-Bisexual 24 24
Anti-Physical Disability 24 66
Anti-Mental Disability 70 89
Anti-Gender Non-Conforming 0 13
Anti-Female 0 48
Anti-Transgender 0 117
Anti-Native Hawaiian or Other Pacific Islander 0 15
Anti-Male 0 25
Anti-Jehovah's Witness 0 7
Anti-Mormon 0 12
Anti-Buddhist 0 15
Anti-Sikh 0 18
Anti-Other Christian 0 24
Anti-Hindu 0 10
Anti-Eastern Orthodox (Russian, Greek, Other) 0 0
Unknown (offender's motivation not known) 0 0
Это исключает необходимость ввода каждого смещения на шаге summarize()
. Я не уверен, как сделать это вычисление в удобочитаемом анализе стиля приборки.
Обратите внимание, что в приведенной выше таблице любое смещение с (
имеет нули в обоих годах. Это потому, что grepl()
рассматривает (
в смещении как символ группировки; исправьте это, добавив fixed = TRUE
n_with_bias <- function(x, bias)
sum(grepl(bias, x, fixed = TRUE))
и обновленный результат
2009 2017
Anti-Black or African American 2300 2101
Anti-White 539 722
Anti-Jewish 932 983
Anti-Arab 0 106
Anti-Protestant 38 42
Anti-Other Religion 111 85
Anti-Islamic (Muslim) 107 284
Anti-Gay (Male) 688 692
Anti-Asian 128 133
Anti-Catholic 52 72
Anti-Heterosexual 21 33
Anti-Hispanic or Latino 486 444
Anti-Other Race/Ethnicity/Ancestry 296 280
Anti-Multiple Religions, Group 48 52
Anti-Multiple Races, Group 180 202
Anti-Lesbian (Female) 186 133
Anti-Lesbian, Gay, Bisexual, or Transgender (Mixed Group) 311 287
Anti-American Indian or Alaska Native 68 244
Anti-Atheism/Agnosticism 10 6
Anti-Bisexual 24 24
Anti-Physical Disability 24 66
Anti-Mental Disability 70 89
Anti-Gender Non-Conforming 0 13
Anti-Female 0 48
Anti-Transgender 0 117
Anti-Native Hawaiian or Other Pacific Islander 0 15
Anti-Male 0 25
Anti-Jehovah's Witness 0 7
Anti-Mormon 0 12
Anti-Buddhist 0 15
Anti-Sikh 0 18
Anti-Other Christian 0 24
Anti-Hindu 0 10
Anti-Eastern Orthodox (Russian, Greek, Other) 0 22
Unknown (offender's motivation not known) 0 0