Есть ли способ изменить порядок переменных после группировки с помощью group_by? - PullRequest
0 голосов
/ 25 сентября 2018

Я пытаюсь воспроизвести рисунок 4.3, найденный в разделе 4.1.3 книги "Анализ текста с помощью R". анализ настроений

enter image description here

В этом разделе делается попытка сгруппировать все биграммы по четырем ключевым словам отрицания: «не», «нет», «никогда» и «без», и для каждой группы он будет изображать вклад чувств (только словом после слов отрицания, что означает неправильный вклад) по отношению к книге.

Итак, я буду рисовать слова как ось y, а вклад как ось x, и чтобы графики выглядели хорошо, я также хочу, чтобы столбцы располагались в порядке убывания для каждой группы.Так же, как и в предыдущих разделах, я переупорядочиваю уровень слов, используя значение вклада.

Но проблема здесь в том, что под каждой группой эти слова будут иметь различный вклад.Например, в группе 1 «счастливый» появляется больше, чем «надежда», поэтому он имеет более высокий вклад, но в группе 2 это противоположный путь.И что еще хуже, я не могу сделать mutate(word2 = reorder(word2, contribution)), когда фрейм данных был group_by(word1).

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

Ниже приведены коды, все, что до #preparing the data for plotting, взято из книги, поэтому не должно быть никаких проблем, с тех пор эти коды принадлежат мне.

library(dplyr)
library(tidytext)
library(janeaustenr)
library(tidyr)

#getting bigrams

austen_bigrams <- austen_books() %>%
  unnest_tokens(bigram, text, token = "ngrams", n = 2)  
bigrams_separated <- austen_bigrams %>%
  separate(bigram, c("word1", "word2"), sep = " ")  

#four negation words to look at

negation_words <- c("not", "no", "never", "without")
AFINN <- get_sentiments("afinn")

#get the sentiment score of words preceded by the four negation words

negated_words <- bigrams_separated %>%
  filter(word1 %in% negation_words) %>%  #word1 as negation words
  inner_join(AFINN, by = c(word2 = "word")) %>%  #word2 as the word following negation words
  count(word1, word2, score, sort = TRUE) %>%
  ungroup()

#preparing the data for plotting

bigrams_plot <- bigrams_separated %>%
  filter(word1 %in% negation_words) %>% 
  inner_join(AFINN, by = c(word2 = "word")) %>%  #getting sentiment score
  count(word1, word2, score, sort = TRUE) %>%
  mutate(contribution = n * score) %>%  #defining contribution as n*score
  group_by(word1) %>%  #group by negation words
  top_n(12,abs(contribution)) %>%
  arrange(desc(abs(contribution))) %>%
  ungroup() %>%
  mutate(word2 = reorder(word2, contribution)) 

#plotting sentiment score contribution grouped by the four negation words

ggplot(bigrams_plot, aes(word2, n * score, fill = n * score > 0)) +
  geom_col(show.legend = FALSE) +
  facet_wrap(~word1, ncol = 2, scales = "free") +
  coord_flip()

Ниже я создал более простую версию:

v1_grp <- c(rep('A',10),rep('B',10))
v2_Aterm <- sample(letters[1:10],10,replace=F)
v2_Bterm <- sample(letters[1:10],10,replace=F)
v3_score <- sample(-10:10,20,replace=T)

data1 <- data_frame(grp=v1_grp,term=c(v2_Aterm,v2_Bterm),score=v3_score)

dataplot <- data1 %>%
  arrange(desc(score)) %>%
  mutate(term=reorder(term,score)) 

ggplot(dataplot, aes(term,score,fill=score>0)) +
  geom_col(show.legend = FALSE) +
  facet_wrap(~grp, ncol = 2, scales = "free") +
  coord_flip()

1 Ответ

0 голосов
/ 25 сентября 2018

(Адаптировано из https://drsimonj.svbtle.com/ordering-categories-within-ggplot2-facets)

dataplot <- data1 %>%
  arrange(grp, score) %>%
  mutate(order = row_number())

ggplot(dataplot, aes(order,score,fill=score>0)) +
  geom_col(show.legend = FALSE) +
  facet_wrap(~grp, ncol = 2, scales = "free") +
  coord_flip() +
  scale_x_continuous(
    breaks = dataplot$order,
    labels = dataplot$term,
    expand = c(0,0)
  )

enter image description here

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...