Cómo buscar en Twitter con rtweet y R

Twitter es una gran fuente de noticias sobre R, ¡especialmente durante conferencias como useR! y RStudio Conference. Y gracias a R y al paquete rtweet, puedes crear tu propia herramienta para descargar tweets para buscar, clasificar y filtrar fácilmente. Echemos un vistazo, paso a paso.

Primero, desea instalar cualquiera de los paquetes del proyecto rtweet que aún no tiene: rtweet, reactable, glue, stringr, httpuv y dplyr. Luego, para comenzar, cargue rtweet y dplyr.

# Si necesita instalar alguno de estos:

# install.packages ("rtweet")

# install.packages ("reactable")

# install.packages ("pegamento")

# install.packages ("stringr")

# install.packages ("httpuv")

# install.packages ("dplyr")

# install.packages ("purrr")

biblioteca (rtweet)

biblioteca (dplyr)

Autorizar la API de Twitter

Para usar rtweet, necesita una cuenta de Twitter para poder autorizar a rtweet a usar sus credenciales de cuenta específicas. Eso es porque hay un límite en la cantidad de tweets que puede descargar en un período de 15 minutos.

Michael Kearney, quien escribió rtweet, ofrece a los usuarios de rtweet dos opciones. La forma más sencilla es simplemente solicitar algunos tweets. Si no hay credenciales almacenadas en su sistema, debería abrirse una ventana del navegador pidiéndole que autorice la solicitud. Después de eso, se almacenará un token de autorización en su archivo .Renviron para que no tenga que volver a autorizar en el futuro.

Puede ir a rtweet.info para ver el otro método, que implica configurar una cuenta de desarrollador de Twitter y un nuevo proyecto para generar credenciales de autorización. Si vas a usar rtweet mucho, probablemente querrás hacerlo. Pero para empezar, la forma más fácil es, bueno, más fácil.

Importar tweets

Para buscar tweets con un hashtag específico (o frase que no es un hashtag), usa la earch_tweets()función s nombrada intuitivamente . Requiere varios argumentos, incluida la consulta, como #rstudioconf o #rstats; si desea incluir retweets; y el número de tweets a devolver. El número predeterminado es 100.

Si bien puede recibir hasta 18,000 tweets en 15 minutos, existe una restricción importante al usar la API de Twitter para buscar una palabra o frase: los resultados de búsqueda solo se remontan de seis a nueve días a menos que pague por una cuenta API de Twitter premium. A diferencia del sitio web de Twitter, no puede usar rtweet para buscar tweets de una conferencia el año pasado. No podrá buscar dos semanas después de una conferencia para obtener esos tweets. Por lo tanto, querrá asegurarse de guardar los tweets que extrae ahora que desee en el futuro.

Hay más argumentos que puedes usar para personalizar tu búsqueda, pero comencemos con una búsqueda básica: 200 tweets con el hashtag #rstudioconf, sin retweets.

tweet_df <- search_tweets ("# rstudioconf", n = 200,

include_rts = FALSE)

Si ejecuta ese código y nunca antes utilizó rtweet, se le pedirá que autorice una aplicación de Twitter.

Tenga en cuenta que aunque solicite 200 tweets, es posible que reciba menos. Una razón es que puede que no haya 200 tweets para su consulta en los últimos seis a nueve días. Otra es que Twitter puede haber extraído inicialmente 200 tweets, pero después de filtrar los retweets, quedaron menos.

El marco de datos tweet_df vuelve con 90 columnas de datos para cada tweet:

Sharon Machlis,

Las columnas que generalmente me interesan más son status_id, created_at, screen_name, text, favorite_count, retweet_count y urls_expanded_url. Es posible que desee otras columnas para su análisis; pero para este tutorial, seleccionaré solo esas columnas. 

Busque, filtre y analice sus tweets

Hay muchas visualizaciones y análisis interesantes que puedes hacer con los datos de Twitter y R. Algunas de ellas están integradas directamente en rtweet. Pero estoy escribiendo este tutorial con mi sombrero de periodista tecnológico. Quiero una manera fácil de ver cosas nuevas y geniales que quizás no conozca.

Los tweets más populares de una conferencia pueden ayudar con eso. Y si utilizo rtweet y la API de Twitter, no tengo que depender del algoritmo "popular" de Twitter. Puedo hacer mis propias búsquedas y establecer mis propios criterios para "popular". Es posible que desee buscar los tweets principales solo del día actual mientras una conferencia está en progreso, o filtrar por un tema específico que me interese, como "brillante" o "ronroneo", ordenados por la mayoría de los me gusta o la mayoría de los retweets.

Una de las formas más sencillas de realizar este tipo de búsquedas y ordenamientos es con una tabla ordenable. DT es un paquete popular para esto. Pero últimamente he estado experimentando con otro: reaccionable. 

El valor predeterminado reactable()es un poco bla. Por ejemplo: 

tweet_table_data <- seleccionar (tweets, -user_id, -status_id)

biblioteca (reactable)

reactable (tweet_table_data)

Este código produce una tabla que se ve así:

Sharon Machlis,

Pero podemos agregar algunas personalizaciones, como:

reactable (tweet_table_data,

filtrable = VERDADERO, buscable = VERDADERO, bordeado = VERDADERO,

rayado = VERDADERO, resaltado = VERDADERO,

defaultPageSize = 25, showPageSizeOptions = TRUE,

showSortable = TRUE, pageSizeOptions = c (25, 50, 75, 100, 200), defaultSortOrder = "desc",

columnas = lista (

created_at = colDef (defaultSortOrder = "asc"),

nombre_pantalla = colDef (defaultSortOrder = "asc"),

text = colDef (html = TRUE, minWidth = 190, redimensionable = TRUE),

cuenta_favorita = colDef (filtrable = FALSO),

retweet_count = colDef (filtrable = FALSE),

urls_expanded_url = colDef (html = TRUE)

)

)

El resultado es una tabla que se parece a esto:

Sharon Machlis,

Configure su tabla de datos reaccionable 

En el fragmento de código anterior, el filterable = TRUEargumento agregó filtros de búsqueda debajo de cada encabezado de columna y searchableagregó el cuadro de búsqueda general de la tabla en la parte superior derecha. Encender bordered, stripedy highlighthace lo que se podría esperar: añade un borde de la tabla, añade alterna fila de color “rayas”, y pone de relieve una fila si se pone un cursor en él.

I set my defaultPageSize to 25. The showPageSizeOptions argument lets me change the page length interactively, and then I define page size options that will show up in a drop-down menu below the table (not visible in the screen shot). The showSortable argument adds little arrow icons next to column names so users know they can click to sort. And I set each column’s defaultSortOrder to descending instead of ascending. So if I click on the column of number of retweets or likes, I will see that as most to least, not least to most.

Finally, there is the columns argument. That’s a list containing a column definition for each column. Look at the reactable help files for more details on other available options. In this example, I set the created_at and screen_name columns to have a default sort order of ascending. For the text column, I set it to display HTML as HTML so I can add clickable links. I also set a minimum column width of 190 pixels and made the column resizable — so users can click and drag to make it wider or narrower.

I also turned off the filter boxes for favorite_count and reply_count. That’s because, unfortunately, reactable filters don’t understand when columns are numbers and will filter them as character strings. While reactable sorts number columns properly, the filter boxes are problematic. That’s the major drawback to reactable vs. the DT package: DT understands column types and filters accordingly. But sorting numerically is enough for me for this purpose. 

You can check out the video at the top of this article to see what it looks like when you sort a column or make the tweet text column wider and narrower.

Make your data table more useful

A couple of things will make this table more useful. This code doesn’t display images or videos included in tweets. That’s fine, because my purpose here is to scan text, not re-create a Twitter application. But that means it will sometimes be helpful to see the original tweet in order to view photos, videos, or comments.

I think it’s convenient to add a small clickable something at the end of each tweet’s text that you can click to see the actual tweet on Twitter. I decided on >> although it could be any character or characters.

To construct a URL, I need to know the format of a tweet, which if you look at any tweet on the Twitter website, you can see is //twitter.com/username/status/tweetID. 

Using the glue package, that would be rendered like this: 

glue::glue("//twitter.com/{screen_name}/status/{status_id}")

If you haven’t used glue before, it’s a great package for pasting together text and variable values. In the above code, any variable name between braces is evaluated.

My full code to create a column with a clickable link to the tweet after the tweet text:

Tweet = glue::glue("{text} >> ") 

And the code to create a data frame for an interactive table:

tweet_table_data %

select(user_id, status_id, created_at, screen_name, text, favorite_count, retweet_count, urls_expanded_url) %>%

mutate(

Tweet = glue::glue("{text} >> ")

)%>%

select(DateTime = created_at, User = screen_name, Tweet, Likes = favorite_count, RTs = retweet_count, URLs = urls_expanded_url)

I'd also like to make clickable links from the URL column, which is now just text. This is a bit complicated, because the URL column is a list column because some tweets include more than one URL.

I’m sure there is a more elegant way to create clickable links from a list column of plain-text URLs, but the code below works. First I create a function to generate the HTML if there are no URLs, one URL, or two or more:

make_url_html <- function(url) {

if(length(url) < 2) {

if(!is.na(url)) {

as.character(glue("{url}") )

} else {

""

}

} else {

paste0(purrr::map_chr(url, ~ paste0("", .x, "", collapse = ", ")), collapse = ", ")

}

}

I run purrr::map_chr() on the URL value if there are two or more URLs so that each URL gets its own HTML; then I paste them together and collapse them into a single character string to appear in the table.

Once my function works, I use purrr::map_chr() again to iterate over each item in the column:

tweet_table_data$URLs <- purrr::map_chr(tweet_table_data$URLs, make_url_html)

Don’t worry if you don’t understand this part, since it’s really more about purrr and list columns than rtweet and reactable. And it’s not necessary to search and sort the tweets; you can always click to the original tweet and see clickable links there.

Finally, I can run my customized reactable() code on the new tweet table data: 

reactable(tweet_table_data,

filterable = TRUE, searchable = TRUE, bordered = TRUE, striped = TRUE, highlight = TRUE,

showSortable = TRUE, defaultSortOrder = "desc", defaultPageSize = 25, showPageSizeOptions = TRUE, pageSizeOptions = c(25, 50, 75, 100, 200),

columns = list(

DateTime = colDef(defaultSortOrder = "asc"),

User = colDef(defaultSortOrder = "asc"),

Tweet = colDef(html = TRUE, minWidth = 190, resizable = TRUE),

Likes = colDef(filterable = FALSE, format = colFormat(separators = TRUE)),

RTs = colDef(filterable = FALSE, format = colFormat(separators = TRUE)),

URLs = colDef(html = TRUE)

)

)

If you’ve been following along, you should have your own interactive table that can search, sort, and filter conference or topic tweets.

Tips for tweet collectors

One thing to remember: If you’re following a conference hashtag during a conference, you will want to pull enough tweets to get the whole conference. So check the earliest date in your tweet data frame. If that date is after the conference started, request more tweets. If your conference hashtag has more than 18,000 tweets (as happened when I was tracking CES) you’ll need to come up with some strategies to get the whole set. Check out the retryonratelimit argument for search_tweets() if you want to collect a whole 18,000+ set of conference hashtag tweets going back 6 days or less 

Finally, make sure to save your data to a local file when the conference ends! A week later, you’ll no longer have access to those tweets via search_tweets() and the Twitter API.

Y vea el episodio adicional "Do More with R" para ver cómo convertir esta aplicación de seguimiento de Twitter en una aplicación Shiny interactiva.

Para obtener más consejos de R, diríjase a la página Do More With R en //bit.ly/domorewithR o la lista de reproducción Do More With R en el canal de YouTube TECHtalk.