Рассмотрим следующий заголовок (10) кадра данных:
![Consider the following head(10) of a dataframe](https://i.stack.imgur.com/j3dGB.png)
Он генерируется этим кодом 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 сообществ выглядит следующим образом:
Я хотел бы показать топ-10 наиболее часто встречающихся тем для сообществаприказал по убыванию.Я попытался сделать это здесь с помощью:
group_by(from_infomap) %>%
add_count(topic) %>%
top_n(10, nn)
Но если я построю это, он вернет только первую топическую тему для сообщества:
Я не уверен, что я делаю не так.В соответствии с этим запросом переполнения стека должна работать взвешенная функция 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](https://i.stack.imgur.com/l0wSH.png)
Что является правильным top_n (10) различных сообществ.Для всех практических целей, график теперь показывает правильные данные.Единственная оставшаяся проблема заключается в том, что организация не сортирует различные темы в порядке убывания для сообщества , а в целом.Незначительная проблема, только улучшит aes, если темы могут быть распределены по сообществу.