Получение первых n значений по группе не работает должным образом - PullRequest
0 голосов
/ 22 ноября 2018

Рассмотрим следующий заголовок (10) кадра данных:

Consider the following head(10) of a dataframe

Он генерируется этим кодом dplyr:

Fuller_list %>% 
 as.data.frame() %>% 
 select(from_infomap, topic) %>%
 add_count(from_infomap) %>% 
 filter(from_infomap %in% coms_keep) %>% 
 group_by(from_infomap) %>%
 add_count(topic) %>%
 top_n(10, nn) %>%
 head(10)

В столбце «from_infomap» имеется 36 различных сообществ, а в столбце «тема» - 47 различных тем.Сгруппированное по «from_infomap» количество тем на сообщество для первых 5 сообществ выглядит следующим образом:

enter image description here Я хотел бы показать топ-10 наиболее часто встречающихся тем для сообществаприказал по убыванию.Я попытался сделать это здесь с помощью:

 group_by(from_infomap) %>%
 add_count(topic) %>%
 top_n(10, nn) 

Но если я построю это, он вернет только первую топическую тему для сообщества:

enter image description here

Я не уверен, что я делаю не так.В соответствии с этим запросом переполнения стека должна работать взвешенная функция top_n (n, wt) на счетчике, она должна давать топ-10 тем, взвешенных по их количеству, сгруппированных по сообществу.

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

Спасибо!

Редактировать: dput без group_by, add_count и top_n:

n <- Fuller_list %>% 
 as.data.frame() %>% 
 select(from_infomap, topic) %>%
 add_count(from_infomap) %>% 
 filter(from_infomap %in% coms_keep) %>% 
 group_by(from_infomap)

dput (head (n, 10)):

structure(list(from_infomap = c(1L, 1L, 1L, 3L, 3L, 3L, 4L, 4L, 
4L, 4L), topic = c("KnysnaFire_thanks_wofire", "Abramjee_caperelief_operationsa", 
"Pick_n_Pay", "Plett_heavy_rain_snow", "Disasters_help_call", 
"KFM_disasters_discussion", "Pick_n_Pay", "Pick_n_Pay", "Pick_n_Pay", 
"Pick_n_Pay"), n = c(30512L, 30512L, 30512L, 6572L, 6572L, 6572L, 
5030L, 5030L, 5030L, 5030L)), row.names = c(NA, -10L), class = c("grouped_df", 
"tbl_df", "tbl", "data.frame"), vars = "from_infomap", drop = TRUE, indices = list(
    0:2, 3:5, 6:9), group_sizes = c(3L, 3L, 4L), biggest_group_size = 4L, labels = structure(list(
    from_infomap = c(1L, 3L, 4L)), row.names = c(NA, -3L), class = "data.frame", vars = "from_infomap", drop = TRUE))

Проблема должна быть воспроизведена путем добавления этого кода в предыдущий блок:

  add_count(topic) %>%
  top_n(10,nn) %>%
  ungroup() %>% 
  ggplot(aes(x = fct_reorder(topic,nn),y = nn,fill = from_infomap))+
  geom_col(width = 1)+
  facet_wrap(~from_infomap, scales = "free")+
  coord_flip()+
  theme(plot.title = element_text("Central Players"), 
        plot.subtitle= element_text("Top 10 indegree centrality profiles of the 20 biggest communities.\n Excluding 'starburst' communities."),
        plot.caption = element_text("Source: Twitter"))+
  theme_few()

Halway-Solution: Таким образом, с помощью метода суммирования, предложенного @s_t, у нас есть следующий код:

Fuller_list %>% 
  as.data.frame() %>% 
  add_count(from_infomap) %>%
  filter(from_infomap %in% coms_keep) %>% 
  group_by(from_infomap,topic) %>%   # group by the topic and community
  summarise(nn = n()) %>%            # count the mentioned arguments
  top_n(10, nn) %>%
  ungroup() %>%
  arrange(from_infomap, nn) %>%
  ggplot(aes(x = fct_reorder(topic,nn),y = nn,fill = from_infomap))+
  geom_col(width = 1)+
  facet_wrap(~from_infomap, scales = "free")+
  coord_flip()+
  theme(plot.title = element_text("Central Players"), 
        plot.subtitle= element_text("Top 10 indegree centrality profiles of the 20 biggest communities.\n Excluding 'starburst' communities."),
        plot.caption = element_text("Source: Twitter"))+
  theme_few()

И это дает: enter image description here

Что является правильным top_n (10) различных сообществ.Для всех практических целей, график теперь показывает правильные данные.Единственная оставшаяся проблема заключается в том, что организация не сортирует различные темы в порядке убывания для сообщества , а в целом.Незначительная проблема, только улучшит aes, если темы могут быть распределены по сообществу.

1 Ответ

0 голосов
/ 22 ноября 2018

Может быть, это может помочь, если я хорошо понял, вы хотели бы подсчитать темы в каждом сообществе, выбрать верхнюю часть (X) и построить их в убывающем порядке в каждом аспекте:

library(ggplot2)
library(dplyr)

data3 <-
  data2 %>%
  select(-n) %>%                     # remove useless column
  group_by(from_infomap,topic) %>%   # group by the topic and community
  summarise(nn = n()) %>%            # count the mentioned arguments
  top_n(5, nn)                       # take the top 5 in this case

Теперь мы обрабатываем заказ, как указано здесь :

data4 <- data3 %>% 
         ungroup() %>%  
         arrange(from_infomap, nn) %>%  
         mutate(topic_r = row_number()) 

Наконец, сюжет:

ggplot(data4, aes(topic_r, nn,fill = from_infomap)) + 
geom_col() +
facet_wrap(~ from_infomap, scales = "free") +
scale_x_continuous(  
                   breaks = d$topic_r,  
                   labels = d$topic
                  ) +
coord_flip()

enter image description here

Я использовал некоторые фальшивые данные, например:

data2 <- data.frame(from_infomap =floor(runif(200, 1,5)) ,
                    topic = sample(letters[1:20], 200, TRUE),
                    n = floor(runif(200, 10,50)) )

У многих тем в сообществах одинаковое количество, поэтому вы не видите только 5 столбцов.

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