---
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<-"@samuel_garcias"

#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)) %>%
  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())

```
















