Как найти итоги разных категорий в одном наборе данных? - PullRequest
1 голос
/ 07 января 2020

Я студент, делающий исследовательский анализ / данные с этим набором данных о преступлениях на почве ненависти. Я пытаюсь создать матрицу из различных категорий (например, расы, религии и т. Д. c) из моего набора данных (hate_crime) в течение 2009 и 2017 гг. Полный набор данных можно найти здесь .

Я извлек необходимые данные (инциденты в течение 2009 или 2017 гг.) Из существующих данных.

SecondYear_OTYear <- hate_crime %>% filter(hate_crime$DATA_YEAR == "2017" | hate_crime$DATA_YEAR == "2009")

Затем я просто сделал разные подмножества для каждой подкатегории в категории. Например, чтобы создать подмножества описаний смещения, я сделал следующее:

antiWhiteSubset <- SecondYear_OTYear[grep("Anti-White", SecondYear_OTYear$BIAS_DESC), ]
antiWhite17 <- nrow(antiWhiteSubset[antiWhiteSubset$DATA_YEAR == "2017", ])
antiWhite09 <- nrow(antiWhiteSubset[antiWhiteSubset$DATA_YEAR == "2009", ])

antiBlackSubset <- SecondYear_OTYear[grep("Anti-Black", SecondYear_OTYear$BIAS_DESC), ]
antiBlack17 <- nrow(antiBlackSubset[antiBlackSubset$DATA_YEAR == "2017", ])
antiBlack09 <- nrow(antiBlackSubset[antiBlackSubset$DATA_YEAR == "2009", ])

antiLatinoSubset <- SecondYear_OTYear[grep("Anti-Hispanic", SecondYear_OTYear$BIAS_DESC), ]
antiLatino17 <- nrow(antiLatinoSubset[antiLatinoSubset$DATA_YEAR == "2017", ])
antiLatino09 <- nrow(antiLatinoSubset[antiLatinoSubset$DATA_YEAR == "2009", ])

И я приступил к выполнению всех описаний смещения с одинаковой структурой. Затем я создал матрицу итоговых значений для создания различных гистограмм, графиков Мосая c или анализа хи-квадрат, например:

Гистограмма инцидентов с преступлениями на почве ненависти по смещению Описания:

enter image description here

Однако я чувствую, что есть более эффективный способ кодирования для различных подмножеств ... Я открыт для любых предложений! Огромное спасибо.

Ответы [ 2 ]

1 голос
/ 07 января 2020

Вы можете использовать dplyr для фильтрации данных и ggplot2::geom_bar для суммирования.

hc_small = hate_crimes %>% filter(DATA_YEAR %in% c(2009, 2017))
top_5 = hc_small %>% count(BIAS_DESC, sort=TRUE) %>% pull(BIAS_DESC) %>% head(5)
hc_5 = hc_small %>% filter(BIAS_DESC %in% top_5)

ggplot(hc_5, aes(BIAS_DESC, fill=BIAS_DESC)) + 
  geom_bar() + 
  facet_wrap(~DATA_YEAR) +
  coord_flip() +
  theme_minimal() +
  guides(fill='none')

enter image description here

0 голосов
/ 08 января 2020

Для агрегирования по фразам, как в первоначальном вопросе, я сделал

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...