Wie man Twitter mit rtweet und R sucht

Twitter ist eine großartige Quelle für Nachrichten über R - besonders bei Konferenzen wie useR! und RStudio-Konferenz. Und dank R und dem rtweet-Paket können Sie Ihr eigenes Tool zum Herunterladen von Tweets zum einfachen Suchen, Sortieren und Filtern erstellen. Schauen wir uns das Schritt für Schritt an.

Zuerst möchten Sie eines der Pakete des rtweet-Projekts installieren, die Sie noch nicht haben: rtweet, reagable, glue, stringr, httpuv und dplyr. Laden Sie dann zum Starten rtweet und dplyr.

# Wenn Sie eines der folgenden Elemente installieren müssen:

# install.packages ("rtweet")

# install.packages ("reaktionsfähig")

# install.packages ("Kleber")

# install.packages ("stringr")

# install.packages ("httpuv")

# install.packages ("dplyr")

# install.packages ("purrr")

Bibliothek (rtweet)

Bibliothek (dplyr)

Autorisieren Sie die Twitter-API

Um rtweet verwenden zu können, benötigen Sie ein Twitter-Konto, damit Sie rtweet zur Verwendung Ihrer spezifischen Kontoanmeldeinformationen autorisieren können. Dies liegt daran, dass die Anzahl der Tweets, die Sie in einem Zeitraum von 15 Minuten herunterladen können, begrenzt ist.

Michael Kearney, der rtweet geschrieben hat, gibt rtweet-Benutzern zwei Möglichkeiten. Am einfachsten ist es, einfach einige Tweets anzufordern. Wenn auf Ihrem System keine Anmeldeinformationen gespeichert sind, sollte ein Browserfenster geöffnet werden, in dem Sie aufgefordert werden, die Anforderung zu autorisieren. Danach wird ein Autorisierungstoken in Ihrer .Renviron-Datei gespeichert, sodass Sie in Zukunft keine erneute Autorisierung vornehmen müssen.

Unter rtweet.info finden Sie die andere Methode, bei der ein Twitter-Entwicklerkonto und ein neues Projekt eingerichtet werden, um Berechtigungsnachweise zu generieren. Wenn Sie rtweet häufig verwenden, möchten Sie dies wahrscheinlich tun. Aber zu Beginn ist der einfachere Weg einfacher.

Tweets importieren

Um nach Tweets mit einem bestimmten Hashtag (oder einer Phrase, die kein Hashtag ist) zu suchen, verwenden Sie die intuitiv benannte earch_tweets()Funktion s . Es sind mehrere Argumente erforderlich, einschließlich der Abfrage, z. B. #rstudioconf oder #rstats. ob Sie Retweets einschließen möchten; und die Anzahl der zurückzugebenden Tweets. Die Standardnummer ist 100.

Während Sie innerhalb von 15 Minuten bis zu 18.000 Tweets empfangen können, gibt es eine wichtige Einschränkung bei der Verwendung der Twitter-API zur Suche nach einem Wort oder einer Phrase: Die Suchergebnisse reichen nur sechs bis neun Tage zurück, es sei denn, Sie zahlen für ein Premium-Twitter-API-Konto. Im Gegensatz zur Twitter-Website können Sie rtweet nicht verwenden, um nach Tweets von einer Konferenz im letzten Jahr zu suchen. Sie können zwei Wochen nach einer Konferenz nicht nach diesen Tweets suchen . Sie sollten also sicherstellen, dass Sie Tweets speichern, die Sie jetzt abrufen, wenn Sie dies in Zukunft möchten.

Es gibt weitere Argumente, mit denen Sie Ihre Suche anpassen können. Beginnen wir jedoch mit einer einfachen Suche: 200 Tweets mit dem Hashtag #rstudioconf ohne Retweets.

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

include_rts = FALSE)

Wenn Sie diesen Code ausführen und noch nie zuvor rtweet verwendet haben, werden Sie aufgefordert, eine Twitter-App zu autorisieren.

Beachten Sie, dass Sie möglicherweise weniger zurückbekommen, obwohl Sie nach 200 Tweets fragen. Ein Grund dafür ist, dass in den letzten sechs bis neun Tagen möglicherweise nicht 200 Tweets für Ihre Anfrage vorhanden sind. Ein weiterer Grund ist, dass Twitter anfangs zwar 200 Tweets extrahiert hat, aber nach dem Herausfiltern von Retweets weniger übrig waren.

Der Datenrahmen tweet_df enthält 90 Datenspalten für jeden Tweet:

Sharon Machlis,

Die Spalten, an denen ich normalerweise am meisten interessiert bin, sind status_id, created_at, screen_name, text, favor_count , retweet_count und urls_expanded_url. Möglicherweise möchten Sie einige andere Spalten für Ihre Analyse. Aber für dieses Tutorial werde ich nur diese Spalten auswählen. 

Suchen, filtern und analysieren Sie Ihre Tweets

Es gibt viele interessante Visualisierungen und Analysen, die Sie mit Twitter-Daten und R durchführen können. Einige davon sind direkt in rtweet integriert. Aber ich schreibe dieses Tutorial mit meinem Hut als Tech-Journalist. Ich möchte auf einfache Weise neue und coole Dinge sehen, von denen ich vielleicht nichts weiß.

Die beliebtesten Tweets einer Konferenz könnten dabei helfen. Und wenn ich rtweet und die Twitter-API verwende, muss ich mich nicht auf den „beliebten“ Algorithmus von Twitter verlassen. Ich kann meine eigenen Suchen durchführen und meine eigenen Kriterien für "beliebt" festlegen. Möglicherweise möchte ich nur während des laufenden Tages nach Top-Tweets suchen oder nach einem bestimmten Thema filtern, an dem ich interessiert bin - wie „glänzend“ oder „purrr“ -, sortiert nach den meisten Likes oder den meisten Retweets.

Eine der einfachsten Möglichkeiten, diese Art von Suchen und Sortieren durchzuführen, ist eine sortierbare Tabelle. DT ist ein beliebtes Paket dafür. Aber in letzter Zeit habe ich mit einem anderen experimentiert: reaktionsfähig. 

Die Standardeinstellung reactable()ist irgendwie bla. Zum Beispiel: 

tweet_table_data <- select (Tweets, -user_id, -status_id)

Bibliothek (reaktionsfähig)

reaktionsfähig (tweet_table_data)

Dieser Code erzeugt eine Tabelle, die folgendermaßen aussieht:

Sharon Machlis,

Wir können jedoch einige Anpassungen hinzufügen, z.

reaktionsfähig (tweet_table_data,

filterbar = WAHR, durchsuchbar = WAHR, umrandet = WAHR,

gestreift = WAHR, hervorheben = WAHR,

defaultPageSize = 25, showPageSizeOptions = TRUE,

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

Spalten = Liste (

created_at = colDef (defaultSortOrder = "asc"),

screen_name = colDef (defaultSortOrder = "asc"),

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

favor_count = colDef (filterbar = FALSE),

retweet_count = colDef (filterbar = FALSE),

urls_expanded_url = colDef (html = TRUE)

)

)

Das Ergebnis ist eine Tabelle, die ungefähr so ​​aussieht:

Sharon Machlis,

Konfigurieren Sie Ihre reaktionsfähige Datentabelle 

Im obigen filterable = TRUECodeblock fügte das Argument Suchfilter unter jeder Spaltenüberschrift searchablehinzu und fügte das gesamte Tabellensuchfeld oben rechts hinzu. Einschalten bordered, stripedund das highlighttut , was man erwarten könnte: Fügt eine Tabellenrahmen, fügt Wechsel Reihe Farbe „Streifen“ und Highlights eine Zeile , wenn Sie auf es einen Cursor setzen.

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.

In der Bonus-Folge „Mach mehr mit R“ erfahren Sie, wie Sie diese Twitter-Tracking-App in eine interaktive Shiny-App verwandeln können.

Weitere R-Tipps finden Sie auf der Seite Do More With R unter //bit.ly/domorewithR oder in der Wiedergabeliste Do More With R auf dem YouTube-Kanal von TECHtalk.