Estou fazendo uma análise exploratória básica de tópicos de duas respostas a perguntas diferentes e tentando visualizar os resultados por pergunta. Estou trabalhando no RStudio e usando um arquivo RMarkdown. O conjunto de dados de exemplo que criei aqui é bem menor do que o que estou usando, o que não deve ser um problema para descrever o problema. Abaixo está todo o código para obter a matriz e a tabela gama, mas tudo funciona bem.
library(tidyverse)
library(tidytext)
library(stm)
#here is a representative example of my data
Term <- c("y57","t44","y57","t44","y57","t44","t44","y57")
Question <- c(1,1,1,1,2,2,2,2)
Id <- c(1,2,1,2,3,4,4,3)
Text <- c("words that are all here in this dataframe", "other sorts of things to meet the needs of the data", "stuff and the like about such and such and this that and the other", "et cetera and so on and so forth and on ad nauseum", "bla bla shockablooey the hooey is newey to youey", "wooly sheep are superior to all other sheep", "come together in this hour of great trial", "right words are different from wrong ones")
df_data <- data.frame(term = Term, question = Question, id = Id, text = Text)
#unnesting the words into a new dataframe
df_tidy <-
df_data %>%
unnest_tokens(word,text)
#setting up the necessary pieces for the topic analysis plot
df_sparse <-
df_tidy %>%
count(id,word) %>%
filter(n > 1) %>%
cast_sparse(id,word,n)
set.seed(216)
topic_model_5 <- stm(df_sparse, K = 5)
df_gamma_5 <-
tidy(topic_model_5,
matrix = "gamma",
document_names = rownames(df_sparse))
Meu problema está na preparação final para a plotagem, na qual quero ordenar os tópicos por uma variável (pergunta) para obter dois gráficos. Estou tentando usar a função left_join entre "df_data" e "df_gamma_5". Pelo menos é isso que acho que este segmento está tentando fazer...
#object type troubleshooting that made sense to me
df_data$question <- as.factor(df_data$question)
df_data$id <- as.character(df_data$id)
#what I can't get unstuck, which I think has to be from the left_join somehow
df_gamma_5 %>%
left_join(
df_data %>%
select(question, document = id) %>%
mutate(question, fct_inorder(question)),
relationship = "many-to-many"
) %>%
mutate(topic = factor(topic)) +
ggplot(aes(gamma, topic, fill = topic)) +
geom_boxplot(alpha = 0.7, show.legend = TRUE) +
ggtitle("topics by question") +
facet_wrap(vars(term)) %>%
print()
A mensagem de erro que recebo dessa linha é:
Joining with `by = join_by(document) `Warning: Detected an unexpected many-to-many relationship between `x` and `y`. Error in `fortify()`:
! `data` must be a <data.frame>, or an object coercible by
`fortify()`, or a valid <data.frame>-like object coercible by
`as.data.frame()`, not a <uneval> object.
ℹ Did you accidentally pass `aes()` to the `data` argument?
Run `rlang::last_trace()` to see where the error occurred.
Isso está me deixando louco porque segui um exemplo online usando dados de letras de Taylor Swift ( https://www.youtube.com/watch?v=rXDv0ZuX0Fc&t=216s ) e o código que escrevi para esse exemplo funcionou perfeitamente. O gráfico que quero é essencialmente o mesmo do vídeo, exceto que em vez de gráficos por álbum (n=11) quero gráficos por pergunta (n=2). Em uma análise mais complexa, gostaria de um 2x2 com cada amostra de gráfico selecionada por termo e pergunta, mas isso é para outro dia. Suspeito que o problema tenha algo a ver com o fato de que, ao contrário do catálogo de Taylor Swift, onde as letras de cada música são uma observação distinta, tenho duas observações de texto diferentes para cada variável id. Não sei se esse é o problema, e mesmo se soubesse, não sei como resolvê-lo.
Estou aprendendo R (e programação em geral) há dez dias, então qualquer ajuda será muito mais difícil do que eu tentar me agarrar a qualquer coisa. Obrigado!