Cara mencari Twitter dengan rtweet dan R

Twitter adalah sumber berita yang baik mengenai R - terutamanya semasa persidangan seperti useR! dan Persidangan RStudio. Dan terima kasih kepada R dan pakej rtweet, anda boleh membina alat anda sendiri untuk memuat turun tweet untuk mencari, menyusun, dan menyaring dengan mudah. Mari kita lihat, langkah demi langkah.

Mula-mula anda ingin memasang mana-mana pakej projek rtweet yang belum anda miliki: rtweet, reactable, gam, stringr, httpuv, dan dplyr. Kemudian untuk memulakan, muatkan rtweet dan dplyr.

# Sekiranya anda perlu memasang salah satu dari ini:

# install.packages ("rtweet")

# install.packages ("boleh bertindak balas")

# install.packages ("gam")

# install.packages ("stringr")

# install.packages ("httpuv")

# install.packages ("dplyr")

# install.packages ("purrr")

perpustakaan (rtweet)

perpustakaan (dplyr)

Mengizinkan API Twitter

Untuk menggunakan rtweet, anda memerlukan akaun Twitter supaya anda boleh membenarkan rtweet untuk menggunakan kelayakan akaun khusus anda. Itu kerana ada had berapa banyak tweet yang dapat anda muat turun dalam jangka masa 15 minit.

Michael Kearney, yang menulis rtweet, memberikan dua pilihan kepada pengguna rtweet. Cara termudah adalah dengan hanya meminta beberapa tweet. Sekiranya tidak ada kelayakan yang tersimpan di sistem anda, tetingkap penyemak imbas akan terbuka yang meminta anda mengesahkan permintaan tersebut. Selepas itu, token kebenaran akan disimpan dalam fail .Renviron anda sehingga anda tidak perlu memberi kebenaran semula pada masa akan datang.

Anda boleh pergi ke rtweet.info untuk melihat kaedah lain, yang melibatkan penyediaan akaun pembangun Twitter dan projek baru untuk menghasilkan bukti kelayakan. Sekiranya anda banyak menggunakan rtweet, anda mungkin mahu melakukannya. Tetapi untuk memulakan, cara yang lebih mudah adalah, lebih baik, lebih mudah.

Import tweet

Untuk mencari tweet dengan hashtag tertentu (atau frasa yang bukan hashtag), anda menggunakan earch_tweets()fungsi bernama intuitif . Ia memerlukan beberapa argumen, termasuk pertanyaan, seperti #rstudioconf atau #rstats; sama ada anda mahu memasukkan retweet; dan bilangan tweet yang akan dikembalikan. Jumlahnya adalah 100.

Walaupun anda dapat menerima hingga 18.000 tweet dalam masa 15 minit, ada batasan penting ketika menggunakan Twitter API untuk mencari kata atau frasa: hasil carian hanya akan kembali enam hingga sembilan hari melainkan anda membayar untuk akaun Twitter API premium. Tidak seperti laman web Twitter, anda tidak boleh menggunakan rtweet untuk mencari tweet dari persidangan tahun lalu. Anda tidak akan dapat mencari dua minggu selepas persidangan untuk mendapatkan tweet tersebut. Oleh itu, anda pasti ingin menyimpan tweet yang anda tarik sekarang yang mungkin anda mahukan pada masa akan datang.

Terdapat lebih banyak argumen yang boleh anda gunakan untuk menyesuaikan carian anda, tetapi mari kita mulakan dengan carian asas: 200 tweet dengan hashtag #rstudioconf, tanpa retweet.

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

include_rts = SALAH)

Sekiranya anda menjalankan kod tersebut dan tidak pernah menggunakan rtweet sebelumnya, anda akan diminta untuk membenarkan aplikasi Twitter.

Perhatikan bahawa walaupun anda meminta 200 tweet, anda mungkin mendapat lebih sedikit. Salah satu sebabnya ialah mungkin tidak ada 200 tweet untuk pertanyaan anda dalam enam hingga sembilan hari terakhir. Satu lagi adalah bahawa Twitter mungkin pada mulanya telah mengekstrak 200 tweet, tetapi setelah menyaring retweet, lebih sedikit yang tersisa.

Rangka data tweet_df kembali dengan 90 lajur data untuk setiap tweet:

Sharon Machlis,

Lajur yang biasanya saya minati adalah status_id, create_at, screen_name, text, favourite_count, retweet_count , dan urls_expanded_url. Anda mungkin mahu beberapa lajur lain untuk analisis anda; tetapi untuk tutorial ini, saya hanya akan memilih lajur tersebut. 

Cari, tapis, dan analisis tweet anda

Terdapat banyak visualisasi dan analisis yang menarik yang dapat anda lakukan dengan data Twitter dan R. Sebahagian daripadanya dibuat dalam rtweet. Tetapi saya menulis tutorial ini dengan memakai topi wartawan teknologi saya. Saya mahukan cara mudah untuk melihat perkara baru dan menarik yang mungkin tidak saya ketahui.

Tweet yang paling disukai dari persidangan mungkin dapat membantu. Dan jika saya menggunakan rtweet dan Twitter API, saya tidak perlu bergantung pada algoritma "popular" Twitter. Saya boleh melakukan carian sendiri dan menetapkan kriteria saya sendiri untuk "popular." Saya mungkin ingin mencari tweet teratas hanya dari hari ini semasa persidangan sedang berlangsung, atau menapis topik tertentu yang saya minati - seperti "berkilau" atau "purrr" - disusun berdasarkan kebanyakan suka atau kebanyakan retweet.

Salah satu kaedah termudah untuk melakukan carian dan jenis ini adalah dengan jadual yang dapat disusun. DT adalah satu pakej popular untuk ini. Tetapi akhir-akhir ini saya telah bereksperimen dengan yang lain: boleh bertindak balas. 

Lalai reactable()adalah jenis bla. Sebagai contoh: 

tweet_table_data <- pilih (tweet, -user_id, -status_id)

perpustakaan (boleh bertindak balas)

boleh bertindak balas (tweet_table_data)

Kod ini menghasilkan jadual yang kelihatan seperti ini:

Sharon Machlis,

Tetapi kita dapat menambahkan beberapa penyesuaian, seperti:

boleh bertindak balas (tweet_table_data,

ditapis = BENAR, dicari = BENAR, bersempadan = BENAR,

berjalur = BENAR, sorotan = BENAR,

defaultPageSize = 25, showPageSizeOptions = BENAR,

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

lajur = senarai (

create_at = colDef (defaultSortOrder = "asc"),

screen_name = colDef (defaultSortOrder = "asc"),

teks = colDef (html = TRUE, minWidth = 190, boleh ubah saiz = BENAR),

favourite_count = colDef (boleh ditapis = SALAH),

retweet_count = colDef (boleh ditapis = SALAH),

urls_expanded_url = colDef (html = BENAR)

)

)

Hasilnya adalah jadual yang kelihatan seperti ini:

Sharon Machlis,

Konfigurasikan jadual data anda yang boleh bertindak balas 

Dalam bahagian kod di atas, filterable = TRUEargumen menambahkan penapis carian di bawah setiap tajuk lajur, dan searchablemenambahkan keseluruhan kotak carian jadual di sebelah kanan atas. Menghidupkan bordered, stripeddan highlightmelakukan apa yang anda jangkakan: Menambah sempadan pong, menambah warna seli-baris "jalur," dan sorotan berturut-turut jika anda meletakkan kursor di atasnya.

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.

Dan periksa bonus episod "Do More with R" untuk melihat bagaimana mengubah aplikasi penjejakan Twitter ini menjadi aplikasi Shiny interaktif.

Untuk lebih banyak petua R, pergi ke halaman Do More With R di //bit.ly/domorewithR atau senarai main Do More With R di saluran YouTube TECHtalk.