rtweetとRでTwitterを検索する方法

Twitterは、Rに関する優れたニュースソースです。特にuseRのような会議ではそうです。およびRStudio会議。また、Rとrtweetパッケージのおかげで、ツイートをダウンロードして簡単に検索、並べ替え、フィルタリングできる独自のツールを作成できます。ステップバイステップで見てみましょう。

まず、まだ持っていないrtweetプロジェクトのパッケージ(rtweet、reactable、glue、stringr、httpuv、dplyr)をインストールします。次に、開始するには、rtweetとdplyrをロードします。

#これらのいずれかをインストールする必要がある場合:

#install.packages( "rtweet")

#install.packages( "reactable")

#install.packages( "glue")

#install.packages( "stringr")

#install.packages( "httpuv")

#install.packages( "dplyr")

#install.packages( "purrr")

ライブラリ(rtweet)

ライブラリ(dplyr)

TwitterAPIを承認する

rtweetを使用するには、Twitterアカウントが必要です。これにより、rtweetが特定のアカウント資格情報を使用することを承認できます。これは、15分間にダウンロードできるツイートの数に制限があるためです。

rtweetを書いたMichaelKearneyは、rtweetユーザーに2つの選択肢を提供します。最も簡単な方法は、単にいくつかのツイートをリクエストすることです。システムに資格情報が保存されていない場合は、ブラウザウィンドウが開き、リクエストを承認するように求められます。その後、認証トークンが.Renvironファイルに保存されるため、後で再認証する必要はありません。

rtweet.infoにアクセスして、Twitter開発者アカウントと新しいプロジェクトを設定して認証資格情報を生成する他の方法を確認できます。rtweetを頻繁に使用する場合は、おそらくそれを使用することをお勧めします。しかし、最初に、より簡単な方法は、まあ、より簡単です。

ツイートをインポートする

特定のハッシュタグ(またはハッシュタグではないフレーズ)を持つツイートを検索するには、直感的に名前が付けられたsearch_tweets()関数を使用します。#rstudioconfや#rstatsなどのクエリを含むいくつかの引数を取ります。リツイートを含めるかどうか。返されるツイートの数。デフォルトの数は100です。

15分以内に最大18,000のツイートを受信できますが、Twitter APIを使用して単語やフレーズを検索する場合、重要な制限があります。プレミアムTwitter APIアカウントを購入しない限り、検索結果は6〜9日しか戻りません。TwitterのWebサイトとは異なり、rtweetを使用して昨年の会議のツイートを検索することはできません。会議の2週間後に検索して、それらのツイートを取得することはできません。したがって、将来必要になる可能性があるため、今プルしたツイートを必ず保存する必要があります。

検索をカスタマイズするために使用できる引数は他にもありますが、基本的な検索から始めましょう。リツイートなしで、#rstudioconfハッシュタグを使用した200件のツイートです。

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

include_rts = FALSE)

そのコードを実行し、以前にrtweetを使用したことがない場合は、Twitterアプリを承認するように求められます。

200のツイートを要求しても、返される回数が少なくなる可能性があることに注意してください。理由の1つは、過去6〜9日間にクエリに対するツイートが200件ない可能性があることです。もう1つは、Twitterが最初に200のツイートを抽出した可能性があることですが、リツイートを除外した後、残ったツイートは少なくなりました。

tweet_dfデータフレームには、ツイートごとに90列のデータが返されます。

シャロン・マクリス、

私が通常最も興味を持っている列は、status_id、created_at、screen_name、text、favorite_count、retweet_count、およびurls_expanded_urlです。分析のために他の列が必要になる場合があります。ただし、このチュートリアルでは、これらの列のみを選択します。 

ツイートを検索、フィルタリング、分析する

TwitterデータとRを使用して実行できる興味深い視覚化と分析がたくさんあります。それらのいくつかはrtweetに直接組み込まれています。しかし、私は技術ジャーナリストの帽子をかぶってこのチュートリアルを書いています。知らないかもしれない新しくてかっこいいものを簡単に見る方法が欲しいです。

会議で最も人気のあるツイートが役立つかもしれません。また、rtweetとTwitter APIを使用する場合、Twitterの「人気のある」アルゴリズムに依存する必要はありません。自分で検索して、「人気」の基準を設定することができます。会議の進行中に当日からのトップツイートを検索したり、「shiny」や「purrr」など、興味のある特定のトピックを最もいいねや最もリツイートで並べ替えてフィルタリングしたい場合があります。

これらの種類の検索と並べ替えを行う最も簡単な方法の1つは、並べ替え可能なテーブルを使用することです。DTはこのための人気のあるパッケージの1つです。しかし最近、私は別のものを実験しています:反応性。 

デフォルトreactable()はなんとなくです。例えば: 

tweet_table_data <-select(tweets、-user_id、-status_id)

ライブラリ(反応可能)

反応可能(tweet_table_data)

このコードは、次のようなテーブルを生成します。

シャロン・マクリス、

ただし、次のようなカスタマイズを追加できます。

反応可能(tweet_table_data、

filterable = TRUE、searchable = TRUE、bordered = TRUE、

ストライプ= TRUE、ハイライト= TRUE、

defaultPageSize = 25、showPageSizeOptions = TRUE、

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

列=リスト(

created_at = colDef(defaultSortOrder = "asc")、

screen_name = colDef(defaultSortOrder = "asc")、

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

Favorite_count = colDef(filterable = FALSE)、

retweet_count = colDef(filterable = FALSE)、

urls_expanded_url = colDef(html = TRUE)

結果は次のようなテーブルになります。

シャロン・マクリス、

反応可能なデータテーブルを構成する 

上記のコードチャンクでは、 filterable = TRUE引数によって各列ヘッダーの下に検索フィルターがsearchable追加され、右上にテーブル全体の検索ボックスが追加されました。、、をオンにするborderedstripedhighlight期待どおりの結果が得られます。テーブルの境界線を追加し、行の交互の色「ストライプ」を追加し、カーソルを置くと行を強調表示します。

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.

また、ボーナスの「Do More with R」エピソードをチェックして、このTwitter追跡アプリをインタラクティブなShinyアプリに変える方法を確認してください。

Rに関するその他のヒントについては、// bit.ly/domorewithRのDo More With Rページ、またはTECHtalkYouTubeチャンネルのDoMore WithRプレイリストにアクセスしてください。