---
title: "R Notebook"
output: html_notebook
---

```{r setup, include=FALSE}
knitr::opts_chunk$set(include = FALSE,echo=FALSE,message=FALSE,warning=FALSE)
```

```{r,include = FALSE,echo=FALSE,message=FALSE,warning=FALSE}

#Aquí escribo el nombre del usuario del que quiero obtener los datos.
#El nombre de usuario tienen que estar escrito entre comillas ""

usuario<-"@Claudiashein"

#Si tipeo crtl alt r se va correr todo el código
```

```{r,include = FALSE,echo=FALSE,message=FALSE,warning=FALSE}

#En esta parte de código puedo especificar algún grupo de palabras que quiero que sea analizada

#Aquí escribo el match en regex, todas las palabras tienen que ser escritas entre comillas ""

key<-c("[Ii]nflaci[óo]n","[Uu]cracia","[Pp]andemia|Covid|COVID","[Bb]olsonaro")

#Como quiero que los terminos aparezcan en las tablas

key_clean<-c("Inflación","Ucrania","COVID","Bolsonaro")
```




```{r,include = FALSE,echo=FALSE,message=FALSE,warning=FALSE}

#Verifico si los paquetes que necesito están instalados, en caso de que no lo estén, los voy a #descargar y luego los voy a cargar.

packages <- c("tidytext","stringi","tidyverse","rtweet","lubridate","scales","syuzhet")

installed_packages <- packages %in% rownames(installed.packages())
if (any(installed_packages == FALSE)) {
  install.packages(packages[!installed_packages])
}

invisible(lapply(packages, library, character.only = TRUE))

```

```{r,include = FALSE,echo=FALSE,message=FALSE,warning=FALSE}
#Aquí se descargan los datos. Cuando hagan la primera consulta se les va a abrir una ventana de #dialogo con Twitter. Hay que tener cuidado con los Firewalls


datos <- get_timeline(usuario,n=3200)

```

```{r,include = FALSE,echo=FALSE,message=FALSE,warning=FALSE}
#Exportando base de datos

a<-paste0("datos_",usuario,".csv")

write_as_csv(datos, a)
```

```{r,include = FALSE,echo=FALSE,message=FALSE,warning=FALSE}

#Limpiando El diccionario

dictionario<-get_sentiment_dictionary('nrc', language = "spanish")

x<-dictionario %>% 
  filter(!sentiment=="anger" | !word %in% c ("epidemia")) %>% 
    filter(!sentiment=="anticipation" | !word %in% c ("epidemia")) %>% 
  filter(!word %in% c("gobierno", "compromiso", "informe", "maría","grupo", "jornada", "tarde", "alto", "fondo","marías","madre","vivienda","presidente", "general", "gobernador", "guerrero", "justicia","hacer","director","días","así","guardia","maría", "hidalgo", "gabinete", "candidato", "electo", "oficial", "niñas", "voto","palabras","aeropuerto","consejo","defensa","consejo","empresa","voto","secretaría","extranjero","congreso","hospital","fondo","arte","madre","premio", "grande", "periódico", "desfile", "general", "director","centro","guardia","puerto","defensa",
 "gabinete", "marina", "encuesta","presupuesto", "electo", "embajador","recursos", "ley", "congreso", "comercio", "serie","firma", "presidenta","sistema", "instituto","banco"))

```


```{r,include = FALSE,echo=FALSE,message=FALSE,warning=FALSE}

#Calculando los sentimientos por tweets

categorias<-x %>% count(sentiment) %>% select(sentiment) %>% as_vector()

data =data.frame()

for(i in 1:length(categorias)) { 
  
  tryCatch({

method <- "custom"
custom_lexicon <- x %>% filter(sentiment==categorias[i])
my_custom_values <- get_sentiment(datos$text, method = method, lexicon = custom_lexicon) %>% as.data.frame()

my_custom_values$emotion<-categorias[i]

data = rbind(data, data.frame (my_custom_values, stringsAsFactors = FALSE))

 }, error=function(e){cat("ERROR :",conditionMessage(e), "\n")})

}

y<-data %>%as_tibble() %>% rename(value=1,emotions=2) %>% mutate(row = row_number()) %>% 
  pivot_wider(names_from = emotions ,values_from =value) %>% select(-row)

y<-as.data.frame(na.omit(apply(y,2,function (x) x[order(is.na(x))])))

sentimientos_usuario<-y %>% as_tibble() %>% mutate(polaridad=positive - negative) %>%
 mutate(
    sentimiento = case_when(
      polaridad > 0 ~ "positivo",
       polaridad < 0 ~ "negativo",
      polaridad == 0 ~ "neutral"))

```


```{r,include = TRUE,echo=FALSE,message=FALSE,warning=FALSE}

#Graficando

titulo<-paste("Análisis de sentimientos de",usuario,"en Twitter")

sentimientos_usuario %>% count(sentimiento) %>%
  mutate(prop = n / sum(n) *100) %>% ggplot(aes(y=prop, x=sentimiento,fill=sentimiento)) +
      geom_col() +
      scale_fill_brewer(palette="RdYlBu") +
      ggtitle(titulo)  + ylab("Porcentaje de Tweets") + xlab("Tipos de polaridad")+theme_light() +
      theme(legend.position="none")     

```

```{r,include = FALSE,echo=FALSE,message=FALSE,warning=FALSE}

#Exportando base de sentimientos 

nombre2<-paste0("sentimientos_",usuario,".csv")

sentimientos_usuario<-sentimientos_usuario %>% mutate(id=1:nrow(sentimientos_usuario))

datos_full<-datos %>% mutate(id=1:nrow(datos)) %>% full_join(sentimientos_usuario)

write_as_csv(datos_full, nombre2)

```

```{r,include = TRUE,echo=FALSE,message=FALSE,warning=FALSE}

#mirar % de sentimientos por mes

titulo<-paste("Análisis de sentimientos de",usuario,"en Twitter a lo largo del tiempo")

datos_full %>%
  mutate(created_at=ymd_hms(created_at)) %>% 
  group_by(month=floor_date(created_at,"month")) %>% 
  count(sentimiento,month)  %>% 
  mutate(prop = n / sum(n) *100) %>%  
  ggplot(aes(y=prop, x=month,colour=sentimiento)) +
        geom_line()+
  ggtitle(titulo)  + ylab("Porcentaje de Tweets Negativos") + xlab("Mes")+
  theme_light()

```


```{r,include = TRUE,echo=FALSE,message=FALSE,warning=FALSE}

titulo<-paste("Análisis de emociones de",usuario,"en Twitter")

datos_full %>% mutate(across(c(anger:trust), ~ifelse(.x>=1,1,0))) %>%  
  summarize(across(c(anger:trust), ~sum(.x))) %>% 
  mutate(across(c(anger:trust), ~(.x)/nrow(datos_full)*100)) %>% 
  pivot_longer(cols = everything(),names_to = "emotion", values_to = "values") %>% 
  filter(!emotion %in% c("positive","negative")) %>% 
   ggplot(aes(y=values, x=emotion,fill=emotion)) +
geom_col(position = position_dodge2(width = 0.9, preserve = "single"))+      scale_fill_brewer(palette="RdYlBu") +
      ggtitle(titulo)  + ylab("Porcentaje de Tweets") + xlab("Emociones")+theme_light() +
      theme(legend.position="bottom") +
   theme(legend.title=element_blank())
```

```{r,include = TRUE,echo=FALSE,message=FALSE,warning=FALSE}

titulo<-paste("Análisis de emociones de",usuario,"a lo largo del tiempo")

datos_full %>%  
  mutate(across(c(anger:trust), ~ifelse(.x>=1,1,0))) %>% mutate(created_at=ymd_hms(created_at)) %>% 
  group_by(month=floor_date(created_at,"month")) %>%
  summarize(across(c(anger:trust), ~sum(.x)),n=n()) %>% 
  mutate(across(c(anger:trust), ~(.x)/n*100)) %>% 
  pivot_longer(anger:trust,names_to = "emotion", values_to = "values") %>% 
  filter(!emotion %in% c("positive","negative")) %>%  
  ggplot(aes(y=values, x=month,color=emotion)) +
        geom_line()+
  ggtitle(titulo)  + ylab("Porcentaje de Tweets") + xlab("Mes")+
  theme_light()

```

```{r,include = TRUE,echo=FALSE,message=FALSE,warning=FALSE}

datos_full%>% 
  mutate(text = str_replace_all(text, "https://t.co/[A-Za-z\\d]+|&amp;", "")) %>% 
    mutate(PAN = ifelse(str_detect(text, "PAN|[Pp]artido [Aa]cci[óo]n [Nn]acional"), 1,0),
           PRI = ifelse(str_detect(text, "PRI,| PRI |PRI\\.|[Pp]artido [Rr]evolucionario [Ii]nstitucional"), 1,0),
           PRD = ifelse(str_detect(text, "PRD|
[Pp]artido [dD]e [Ll]a [Rr]evoluci[óO]n [Dd]emocr[Aá]tica"),1,0),
           Morena = ifelse(str_detect(text, "[Mm]orena"), 1,0),
           PT = ifelse(str_detect(text, "PT|[Pp]artido [dD]el [Tt]rabajo"), 1,0),
           MC = ifelse(str_detect(text, "MC|[Mm]ovimiento [Cc]iudadano"), 1,0),
           PV = ifelse(str_detect(text, "[Pp]artido [Vv]erde"), 1,0))%>%
   summarize(across(c(PAN:PV), ~sum(.x))) %>% 
  pivot_longer(cols = everything(),names_to = "emotion", values_to = "values") %>% 
   ggplot(aes(y=values, x=emotion,fill=emotion)) +
geom_col(position = position_dodge2(width = 0.9, preserve = "single"))+      scale_fill_brewer(palette="RdYlBu") +
      ggtitle("Número de Menciones por Partido Político")  + ylab("Número de Tweets") + xlab("Partidos Políticos")+theme_light() +
      theme(legend.position="none") +
   theme(legend.title=element_blank())


```

```{r,include = FALSE,echo=FALSE,message=FALSE,warning=FALSE}

#Exportar base con partidos

base2<-datos_full%>% 
  mutate(text = str_replace_all(text, "https://t.co/[A-Za-z\\d]+|&amp;", "")) %>% 
    mutate(PAN = ifelse(str_detect(text, "PAN|[Pp]artido [Aa]cci[óo]n [Nn]acional"), 1,0),
           PRI = ifelse(str_detect(text, "PRI,| PRI |PRI\\.|[Pp]artido [Rr]evolucionario [Ii]nstitucional"), 1,0),
           PRD = ifelse(str_detect(text, "PRD|
[Pp]artido [dD]e [Ll]a [Rr]evoluci[óO]n [Dd]emocr[Aá]tica"),1,0),
           Morena = ifelse(str_detect(text, "[Mm]orena"), 1,0),
           PT = ifelse(str_detect(text, "PT|[Pp]artido [dD]el [Tt]rabajo"), 1,0),
           MC = ifelse(str_detect(text, "MC|[Mm]ovimiento [Cc]iudadano"), 1,0),
           PV = ifelse(str_detect(text, "[Pp]artido [Vv]erde"), 1,0))

a<-paste0("datos_partidos",usuario,".csv")

write_as_csv(base2, a)


```


```{r,include = FALSE,echo=FALSE,message=FALSE,warning=FALSE}

#Emociones por partido

partidos<-datos_full%>%
  mutate(text = str_replace_all(text, "https://t.co/[A-Za-z\\d]+|&amp;", "")) %>% 
    mutate(PAN = ifelse(str_detect(text, "PAN|[Pp]artido [Aa]cci[óo]n [Nn]acional"), 1,0),
           PRI = ifelse(str_detect(text, "PRI,| PRI |PRI\\.|[Pp]artido [Rr]evolucionario [Ii]nstitucional"), 1,0),
           PRD = ifelse(str_detect(text, "PRD|
[Pp]artido [dD]e [Ll]a [Rr]evoluci[óO]n [Dd]emocr[Aá]tica"),1,0),
           Morena = ifelse(str_detect(text, "[Mm]orena"), 1,0),
           PT = ifelse(str_detect(text, "PT|[Pp]artido [dD]el [Tt]rabajo"), 1,0),
           MC = ifelse(str_detect(text, "MC|[Mm]ovimiento [Cc]iudadano"), 1,0),
           PV = ifelse(str_detect(text, "[Pp]artido [Vv]erde"), 1,0))%>% 
           filter(if_any(c(PAN:PV), ~(.x)==1)) 


nombres<-partidos %>% select(PAN:PV) %>% pivot_longer(cols = everything(),names_to = "pp", values_to = "values") %>% count(pp) %>% select(pp) %>% as_vector

data2 =data.frame()

for(i in 1:length(nombres)) { 
  
  tryCatch({

info<-partidos %>%
  pivot_longer(PAN:PV,names_to = "pp", values_to = "values") %>% 
  filter(pp==nombres[i]&values==1) %>% count(sentimiento) %>%
      mutate(prop = n / sum(n) *100,partido=nombres[i])

data2 = rbind(data2, data.frame (info, stringsAsFactors = FALSE))


 }, error=function(e){cat("ERROR :",conditionMessage(e), "\n")})

}

```


```{r,include = TRUE,echo=FALSE,message=FALSE,warning=FALSE}

data2 %>% 
ggplot(aes(partido, prop, fill = sentimiento)) +
geom_col(position = position_dodge2(width = 0.9, preserve = "single"))+      scale_fill_brewer(palette="RdYlBu") +
      ggtitle("Análisis de sentimientos por Partido Político")  + ylab("Porcentaje de Tweets") + xlab("Partidos Políticos")+theme_light() +
      theme(legend.position="bottom") +
   theme(legend.title=element_blank())
```

```{r,include = TRUE,echo=FALSE,message=FALSE,warning=FALSE}

datos_full%>% 
  mutate(text = str_replace_all(text, "https://t.co/[A-Za-z\\d]+|&amp;", "")) %>% 
    mutate(AMLO = ifelse(str_detect(text, "AMLO"), 1,0),
           Bienestar = ifelse(str_detect(text, "[Bb]ienestar"), 1,0),
           CUATRO_T = ifelse(str_detect(text, "#4T"),1,0),
           Morena = ifelse(str_detect(text, "[Mm]orena"), 1,0),
           Felipe_Calderon = ifelse(str_detect(text, "[Ff]elipe [Cc]alder[oó]n"), 1,0),
           Samuel_Garcia = ifelse(str_detect(text, "[Ss]amuel [Gg]arc[ií]a"), 1,0),
           Tren_Maya = ifelse(str_detect(text, "[Tt]ren [Mm]aya"), 1,0),
           Dos_Bocas = ifelse(str_detect(text, "[Rr]efiner[íi]a [Dd]os [Bb]ocas|[Dd]os [Bb]ocas"), 1,0),
            Ayotzinapa = ifelse(str_detect(text, "[Aa]yotzinapa"), 1,0)
           )%>%
   summarize(across(c(AMLO:Ayotzinapa), ~sum(.x))) %>% 
  pivot_longer(cols = everything(),names_to = "emotion", values_to = "values") %>% 
   ggplot(aes(y=values, x=fct_reorder(emotion,values),fill=emotion)) +
geom_col(position = position_dodge2(width = 0.9, preserve = "single"))+      scale_fill_brewer(palette="RdYlBu") +
      ggtitle("Número de menciones por palabra clave")  + ylab("Número de Tweets") + xlab("")+theme_light() +
      theme(legend.position="none") +
   theme(legend.title=element_blank())+coord_flip()
```


```{r,include = FALSE,echo=FALSE,message=FALSE,warning=FALSE}

#Exportar palabras claves

palabras_claves<-datos_full%>% 
  mutate(text = str_replace_all(text, "https://t.co/[A-Za-z\\d]+|&amp;", "")) %>% 
    mutate(AMLO = ifelse(str_detect(text, "AMLO"), 1,0),
           Bienestar = ifelse(str_detect(text, "[Bb]ienestar"), 1,0),
           CUATRO_T = ifelse(str_detect(text, "#4T"),1,0),
           Morena = ifelse(str_detect(text, "[Mm]orena"), 1,0),
           Felipe_Calderon = ifelse(str_detect(text, "[Ff]elipe [Cc]alder[oó]n"), 1,0),
           Samuel_Garcia = ifelse(str_detect(text, "[Ss]amuel [Gg]arc[ií]a"), 1,0),
           Tren_Maya = ifelse(str_detect(text, "[Tt]ren [Mm]aya"), 1,0),
           Dos_Bocas = ifelse(str_detect(text, "[Rr]efiner[íi]a [Dd]os [Bb]ocas|[Dd]os [Bb]ocas"), 1,0),
            Ayotzinapa = ifelse(str_detect(text, "[Aa]yotzinapa"), 1,0)
           )

a<-paste0("datos_palabras_claves",usuario,".csv")

write_as_csv(palabras_claves, a)


```

```{r,include = FALSE,echo=FALSE,message=FALSE,warning=FALSE}

key_words<-datos_full%>% 
  mutate(text = str_replace_all(text, "https://t.co/[A-Za-z\\d]+|&amp;", "")) %>% 
    mutate(AMLO = ifelse(str_detect(text, "AMLO"), 1,0),
           Bienestar = ifelse(str_detect(text, "[Bb]ienestar"), 1,0),
           CUATRO_T = ifelse(str_detect(text, "#4T"),1,0),
           Morena = ifelse(str_detect(text, "[Mm]orena"), 1,0),
           Felipe_Calderon = ifelse(str_detect(text, "[Ff]elipe [Cc]alder[oó]n"), 1,0),
           Samuel_Garcia = ifelse(str_detect(text, "[Ss]amuel [Gg]arc[ií]a"), 1,0),
           Tren_Maya = ifelse(str_detect(text, "[Tt]ren [Mm]aya"), 1,0),
           Dos_Bocas = ifelse(str_detect(text, "[Rr]efiner[íi]a [Dd]os [Bb]ocas|[Dd]os [Bb]ocas"), 1,0),
            Ayotzinapa = ifelse(str_detect(text, "[Aa]yotzinapa"), 1,0))%>% 
           filter(if_any(c(AMLO:Ayotzinapa), ~(.x)==1)) 
           


terminos<-key_words %>% select(AMLO:Ayotzinapa) %>% pivot_longer(cols = everything(),names_to = "pp", values_to = "values") %>% count(pp) %>% select(pp) %>% as_vector

```



```{r,include = FALSE,echo=FALSE,message=FALSE,warning=FALSE}
data3 =data.frame()

for(i in 1:length(terminos)) { 
  
  tryCatch({

info<-key_words %>%
  pivot_longer(AMLO:Ayotzinapa,names_to = "pp", values_to = "values") %>% 
  filter(pp==terminos[i]&values==1) %>% count(sentimiento) %>%
      mutate(prop = n / sum(n) *100,termino=terminos[i])

data3 = rbind(data3, data.frame (info, stringsAsFactors = FALSE))


 }, error=function(e){cat("ERROR :",conditionMessage(e), "\n")})

}
```


```{r,include = TRUE,echo=FALSE,message=FALSE,warning=FALSE}
data3 %>% 
ggplot(aes(termino, prop, fill = sentimiento)) +
geom_col(position = position_dodge2(width = 0.9, preserve = "single"))+      scale_fill_brewer(palette="RdYlBu") +
      ggtitle("Análisis de sentimientos por términos de interés")  + ylab("Porcentaje de Tweets") + xlab("Términos de Interés")+theme_light() +
      theme(legend.position="bottom") +
   theme(legend.title=element_blank())
```

```{r,include = FALSE,echo=FALSE,message=FALSE,warning=FALSE}

data5 =data.frame()

for(i in 1:length(terminos)) { 
  
  tryCatch({
    
n<-key_words %>%
  pivot_longer(AMLO:Ayotzinapa,names_to = "pp", values_to = "values")%>% 
  filter(pp==terminos[i]&values==1)    
    
info<-palabras_claves %>%
  pivot_longer(AMLO:Ayotzinapa,names_to = "pp", values_to = "values")%>% 
  filter(pp==terminos[i]&values==1) %>%
  mutate(across(c(anger:trust), ~ifelse(.x>=1,1,0))) %>% 
  select(-positive,-negative) %>% 
  summarize(across(c(anger:trust), ~sum(.x))) %>% 
  pivot_longer(anger:trust,names_to = "emotion", values_to = "values") %>% 
  mutate(prop = values / nrow(n) *100,partido=terminos[i])

data5 = rbind(data5, data.frame (info, stringsAsFactors = FALSE))


 }, error=function(e){cat("ERROR :",conditionMessage(e), "\n")})

}
```

```{r,include = TRUE,echo=FALSE,message=FALSE,warning=FALSE}

data5 %>% filter(is.na(partido)==FALSE) %>% mutate(prop=ifelse(is.na(prop), 0,prop)) %>% 
  filter(prop!=0) %>% 
ggplot(aes(partido, prop, fill = emotion)) +
  geom_col(position = position_dodge2(width = 0.9, preserve = "single"))+      scale_fill_brewer(palette="RdYlBu") +
      ggtitle("Análisis de emociones por términos de interés")  + ylab("Porcentaje de Tweets") + xlab("Términos de Interés")+theme_light() +
      theme(legend.position="bottom") +
   theme(legend.title=element_blank())

```




```{r,include = TRUE,echo=FALSE,message=FALSE,warning=FALSE}

custom_stop_words <- bind_rows(stop_words,
                               data_frame(word = tm::stopwords("spanish"),
                                          lexicon = "custom")) %>% 
  as_tibble()  %>% 
  filter(lexicon=="custom")

tweet_words <- datos_full %>%
  filter(!str_detect(text, '^"')) %>%
  mutate(text = str_replace_all(text, "https://t.co/[A-Za-z\\d]+|&amp;", "")) %>%
  unnest_tokens(word, text) %>%
  filter(!word %in% custom_stop_words$word,
         str_detect(word, "[a-z]"))

tweet_words %>% count(word,sort=TRUE)%>% 
mutate(letras=nchar(word)) %>% filter(letras>1) %>% 
  filter(!word %in% c("t.co","http","cómo","si","quién","así") ) %>% 
  slice_head(n=20) %>%
  ggplot(aes(n,fct_reorder(word,n)))+geom_col()+
  labs(x = "frecuencia", y = "palabras", fill = "")+
  ggtitle("Las 20 palabras con la mayor frecuencia")+
  theme_light()


```

```{r,include = FALSE,echo=FALSE,message=FALSE,warning=FALSE}

frecuencia_palabras<-datos_full %>%
  filter(!str_detect(text, '^"')) %>%
  mutate(text = str_replace_all(text, "https://t.co/[A-Za-z\\d]+|&amp;", "")) %>%
  unnest_tokens(word, text) %>%
  filter(!word %in% custom_stop_words$word,
         str_detect(word, "[a-z]")) %>% count(word,sort=TRUE)

a<-paste0("frecuencia_palabras",usuario,".csv")

write_as_csv(frecuencia_palabras, a)
```




```{r,include = FALSE,echo=FALSE,message=FALSE,warning=FALSE}

#filtro los dispositivos con mas de 100 publicaciones. 

devices<-datos_full %>% count(source, sort=TRUE) %>% mutate(perc = n / nrow(datos_full) *100) %>%
  filter(n>100) %>% select(source) %>% as_vector()

```



```{r,include = TRUE,echo=FALSE,message=FALSE,warning=FALSE}

#Miremos como se comportan estas, partamos por las horas en las que hacen publicaciones

datos_full %>% 
  filter(source%in% c(devices)) %>% 
  count(source, hour = hour(with_tz(created_at))) %>%
  mutate(percent = n / sum(n)) %>%
  ggplot(aes(hour, percent, color = source)) +
  geom_line() +
  scale_y_continuous(labels = percent_format()) +ggtitle("% de publicaciones por fuente a lo largo del día")+
  labs(x = "Hora del Día",
       y = "% de tweets",
       color = "")+theme_light()
```

```{r,include = TRUE,echo=FALSE,message=FALSE,warning=FALSE}

#Miremos los tweets a lo largo del tiempo

datos_full %>% 
    mutate(created_at=ymd_hms(created_at)) %>% 
group_by(month=floor_date(created_at,"month")) %>% count(source) %>% 
  mutate(prop = n / sum(n)*100) %>%  
  filter(source%in% c(devices)) %>% 
  ggplot(aes(month, prop, color = source)) +
  geom_line() +ggtitle("% de publicaciones por fuente a lo largo del tiempo")+
  labs(x = "Mes", y = "% de tweets", color = "") +theme_light()

```

```{r,include = FALSE,echo=FALSE,message=FALSE,warning=FALSEr}

devicesTOP2<-datos_full %>% count(source, sort=TRUE) %>% mutate(perc = n / nrow(datos_full) *100) %>%
  mutate(rank=dense_rank(desc(n))) %>%  slice_head(n=2) %>% select(source) %>% as_vector()

firstdevice<-datos_full %>% count(source, sort=TRUE) %>% mutate(perc = n / nrow(datos_full) *100) %>%
  mutate(rank=dense_rank(desc(n))) %>%filter(rank==1) %>% select(source) %>% as_vector()
  
seconddevice<-datos_full %>% count(source, sort=TRUE) %>% mutate(perc = n / nrow(datos_full) *100)%>%
  mutate(rank=dense_rank(desc(n))) %>%filter(rank==2) %>% select(source) %>% as_vector()


```


```{r,include = TRUE,echo=FALSE,message=FALSE,warning=FALSE}


ratios<-tweet_words %>%
  filter(source %in% c(devicesTOP2)) %>% 
  mutate(source = str_replace_all(source,"Twitter for |Twitter ", "")) %>% 
  count(word, source) %>%
  filter(sum(n) >= 5) %>%
  spread(source, n, fill = 0) %>%
  ungroup() %>%
  mutate_each(funs((. + 1) / sum(. + 1)), -word) %>%
  mutate(logratio = log2(.[[2]] / .[[3]])) %>%
  arrange(desc(logratio))

titulo<-paste0(seconddevice," / ",firstdevice)

ratios %>% group_by(direction = logratio > 0) %>%
  mutate(source=ifelse(direction==TRUE,firstdevice,seconddevice))%>% 
    mutate(source = str_replace_all(source,"Twitter for |Twitter ", "")) %>% 
  top_n(15, abs(logratio)) %>%
  ungroup() %>%
  mutate(word = reorder(word, logratio)) %>%
  group_by(direction = logratio > 0) %>%
  mutate(absolute=abs(logratio)) %>% 
    ungroup() %>%
 arrange(desc(absolute)) %>% 
  group_by(source) %>% 
  slice_head(n=15) %>% 

  ggplot(aes(logratio, word,fill=source)) +
  geom_col() +
  labs(x = titulo, y = NULL)+ 
  ggtitle("Palabras mas probables para las 2 fuentes principales")+
  theme_light()


```



```{r,include = TRUE,echo=FALSE,message=FALSE,warning=FALSEr}

titulo<-paste("Análisis de sentimientos de",usuario,"en Twitter por fuente")


datos_full %>%  group_by(source) %>% 
  count(sentimiento)  %>% 
  mutate(prop = n / sum(n) *100) %>%  
  filter(source%in% c(devices)) %>% 
mutate(source = str_replace_all(source,"Twitter for |Twitter ","")) %>% 
        ggplot(aes(y=prop, x=source,fill=sentimiento)) +
geom_col(position = position_dodge2(width = 0.9, preserve = "single"))+      scale_fill_brewer(palette="RdYlBu") +
      ggtitle(titulo)  + ylab("Porcentaje de Tweets") + xlab("Tipos de fuentes")+theme_light() +
      theme(legend.position="bottom") +
   theme(legend.title=element_blank())

```


```{r,include = TRUE,echo=FALSE,message=FALSE,warning=FALSE}

datos_full %>%
  filter(!str_detect(text, '^"')) %>%
  mutate(
        media = ifelse(str_detect(text, "t.co"),
                         "Foto/Video", "No Foto/Video")) %>%  group_by(media) %>% 
  count(sentimiento)  %>% 
  mutate(prop = n / sum(n) *100) %>%  
        ggplot(aes(y=prop, x=media,fill=sentimiento)) +
geom_col(position = position_dodge2(width = 0.9, preserve = "single"))+      scale_fill_brewer(palette="RdYlBu") +
      ggtitle("Tweets con contenido multimedia vs tweets sin contenido multimedia")  + ylab("Porcentaje de Tweets") + xlab("")+theme_light() +
      theme(legend.position="bottom") +
   theme(legend.title=element_blank())

```


```{r,include = TRUE,echo=FALSE,message=FALSE,warning=FALSE}

data3 =data.frame()

for(i in 1:length(key)) { 
  
  tryCatch({

info<-datos_full%>% 
  mutate(text = str_replace_all(text, "https://t.co/[A-Za-z\\d]+|&amp;", "")) %>% 
    mutate(value = ifelse(str_detect(text, key[i]), 1,0),palabra=key_clean[i])

data3 = rbind(data3, data.frame (info, stringsAsFactors = FALSE))


 }, error=function(e){cat("ERROR :",conditionMessage(e), "\n")})

}

```


```{r,include = TRUE,echo=FALSE,message=FALSE,warning=FALSE}

data3 %>% pivot_wider(names_from = palabra ,values_from =value) %>% summarize(across(c(key_clean), ~sum(.x))) %>%   pivot_longer(cols = everything(),names_to = "emotion", values_to = "values") %>%  
  ggplot(aes(y=values, x=fct_reorder(emotion,values),fill=emotion)) +
geom_col(position = position_dodge2(width = 0.9, preserve = "single"))+      scale_fill_brewer(palette="RdYlBu") +
      ggtitle("Número de menciones por palabra clave")  + ylab("Número de Tweets") + xlab("")+theme_light() +
      theme(legend.position="none") +
   theme(legend.title=element_blank())+coord_flip()

```

```{r,include = FALSE,echo=FALSE,message=FALSE,warning=FALSE}

key_words<-data3 %>% pivot_wider(names_from = palabra ,values_from =value)%>% 
           filter(if_any(c(key_clean), ~(.x)==1)) 

data4 =data.frame()

for(i in 1:length(key_clean)) { 
  
  tryCatch({

info<-key_words %>%
  pivot_longer(c(key_clean),names_to = "pp", values_to = "values") %>% 
  filter(pp==key_clean[i]&values==1) %>% count(sentimiento) %>%
      mutate(prop = n / sum(n) *100,termino=key_clean[i])

data4 = rbind(data4, data.frame (info, stringsAsFactors = FALSE))


 }, error=function(e){cat("ERROR :",conditionMessage(e), "\n")})

}
```


```{r,include = TRUE,echo=FALSE,message=FALSE,warning=FALSE}

data4 %>% 
ggplot(aes(termino, prop, fill = sentimiento)) +
geom_col(position = position_dodge2(width = 0.9, preserve = "single"))+      scale_fill_brewer(palette="RdYlBu") +
      ggtitle("Análisis de sentimientos por términos de interés")  + ylab("Porcentaje de Tweets") + xlab("Términos de Interés")+theme_light() +
      theme(legend.position="bottom") +
   theme(legend.title=element_blank())

``` 

```{r,include = FALSE,echo=FALSE,message=FALSE,warning=FALSE}

#Exportar palabras claves

palabras_custom<-data3 %>% pivot_wider(names_from = palabra ,values_from =value)

a<-paste0("datos_palabras_custom",usuario,".csv")

write_as_csv(palabras_custom, a)

```


```{r,include = FALSE,echo=FALSE,message=FALSE,warning=FALSE}

n<-key_words %>%
  pivot_longer(c(key_clean),names_to = "pp", values_to = "values")%>% 
  filter(pp=="COVID"&values==1)

info<-palabras_custom %>%
  pivot_longer(c(key_clean),names_to = "pp", values_to = "values")%>% 
  filter(pp=="COVID"&values==1) %>%
  mutate(across(c(anger:trust), ~ifelse(.x>=1,1,0))) %>% 
  select(-positive,-negative) %>% 
  summarize(across(c(anger:trust), ~sum(.x))) %>% 
  pivot_longer(anger:trust,names_to = "emotion", values_to = "values") %>% 
  mutate(prop = values / nrow(n) *100,partido="COVID")

```


          
           
```{r,include = FALSE,echo=FALSE,message=FALSE,warning=FALSE}

data5 =data.frame()

for(i in 1:length(terminos)) { 
  
  tryCatch({
    
n<-key_words %>%
  pivot_longer(c(key_clean),names_to = "pp", values_to = "values")%>% 
  filter(pp==key_clean[i]&values==1)    
    
info<-palabras_custom %>%
  pivot_longer(c(key_clean),names_to = "pp", values_to = "values")%>% 
  filter(pp==key_clean[i]&values==1) %>%
  mutate(across(c(anger:trust), ~ifelse(.x>=1,1,0))) %>% 
  select(-positive,-negative) %>% 
  summarize(across(c(anger:trust), ~sum(.x))) %>% 
  pivot_longer(anger:trust,names_to = "emotion", values_to = "values") %>% 
  mutate(prop = values / nrow(n) *100,partido=key_clean[i])

data5 = rbind(data5, data.frame (info, stringsAsFactors = FALSE))


 }, error=function(e){cat("ERROR :",conditionMessage(e), "\n")})

}
```



```{r,include = TRUE,echo=FALSE,message=FALSE,warning=FALSE}

data5 %>% filter(is.na(partido)==FALSE) %>% mutate(prop=ifelse(is.na(prop), 0,prop)) %>% 
  filter(prop!=0) %>% 
ggplot(aes(partido, prop, fill = emotion)) +
  geom_col(position = position_dodge2(width = 0.9, preserve = "single"))+      scale_fill_brewer(palette="RdYlBu") +
      ggtitle("Análisis de emociones por términos de interés")  + ylab("Porcentaje de Tweets") + xlab("Términos de Interés")+theme_light() +
      theme(legend.position="bottom") +
   theme(legend.title=element_blank())

```
















