项目作者: favstats

项目描述 :
Analyzing Tweets during ECPR Conference 2018
高级语言:
项目地址: git://github.com/favstats/ecprconf2018_twitter.git
创建时间: 2018-08-23T23:33:13Z
项目社区:https://github.com/favstats/ecprconf2018_twitter

开源协议:

下载


ECPR Conference 2018 Twitter Analysis

Fabio
2018-08-25

This is a short notebook outlining the code used to scrape tweets
related to the ECPR Conference 2018 in Hamburg.

Packages

Load the necessary packages

  1. # install pacman once if not avaible on your machine
  2. # install.packages("pacman")
  3. pacman::p_load(tidyverse, purrr, tidyr, rtweet, stringr, ggraph, igraph, tidygraph, forcats)

Get Data

Call Twitter API. If you want to scrape data yourself you have to
register a free account where you get your personal access point to
Twitter. Check out rtweet on
github and follow their instructions to the twitter authentication.

  1. twitter_token <- readRDS("twitter_token.rds")
  2. rt <- search_tweets(
  3. "#ecprconf18 OR #ecprconf2018", n = 5000, include_rts = F, retryonratelimit = T
  4. )
  5. save(rt, file = "data/rt.Rdata")

Lets first look at the data structure and column names. Twitter returns
over 1,200 unique tweets.

  1. load("data/rt.Rdata")
  2. rt %>% glimpse # the same as str, returns a df overview
  1. ## Observations: 1,399
  2. ## Variables: 88
  3. ## $ user_id <chr> "21951668", "21951668", "21951668", "2...
  4. ## $ status_id <chr> "1033324994552573952", "10325642035535...
  5. ## $ created_at <dttm> 2018-08-25 12:07:31, 2018-08-23 09:44...
  6. ## $ screen_name <chr> "akreppel", "akreppel", "akreppel", "a...
  7. ## $ text <chr> "While the croissants can be treachero...
  8. ## $ source <chr> "Twitter for iPhone", "Twitter for iPa...
  9. ## $ display_text_width <dbl> 92, 110, 37, 126, 215, 165, 158, 32, 2...
  10. ## $ reply_to_status_id <chr> NA, "1032375076652347393", NA, NA, NA,...
  11. ## $ reply_to_user_id <chr> NA, "21951668", NA, NA, NA, NA, NA, NA...
  12. ## $ reply_to_screen_name <chr> NA, "akreppel", NA, NA, NA, NA, NA, NA...
  13. ## $ is_quote <lgl> FALSE, FALSE, FALSE, FALSE, FALSE, FAL...
  14. ## $ is_retweet <lgl> FALSE, FALSE, FALSE, FALSE, FALSE, FAL...
  15. ## $ favorite_count <int> 0, 2, 5, 2, 14, 9, 0, 2, 5, 5, 5, 2, 8...
  16. ## $ retweet_count <int> 0, 0, 0, 0, 5, 5, 0, 0, 4, 1, 1, 2, 2,...
  17. ## $ hashtags <list> ["ecprconf18", "ECPRconf2018", "ecprc...
  18. ## $ symbols <list> [NA, NA, NA, NA, NA, NA, NA, NA, NA, ...
  19. ## $ urls_url <list> [NA, NA, NA, NA, "ecpr.eu/Events/Pane...
  20. ## $ urls_t.co <list> [NA, NA, NA, NA, "https://t.co/KIzaT3...
  21. ## $ urls_expanded_url <list> [NA, NA, NA, NA, "https://ecpr.eu/Eve...
  22. ## $ media_url <list> [NA, NA, NA, NA, "http://pbs.twimg.co...
  23. ## $ media_t.co <list> [NA, NA, NA, NA, "https://t.co/4Els2K...
  24. ## $ media_expanded_url <list> [NA, NA, NA, NA, "https://twitter.com...
  25. ## $ media_type <list> [NA, NA, NA, NA, "photo", NA, "photo"...
  26. ## $ ext_media_url <list> [NA, NA, NA, NA, "http://pbs.twimg.co...
  27. ## $ ext_media_t.co <list> [NA, NA, NA, NA, "https://t.co/4Els2K...
  28. ## $ ext_media_expanded_url <list> [NA, NA, NA, NA, "https://twitter.com...
  29. ## $ ext_media_type <chr> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA...
  30. ## $ mentions_user_id <list> [NA, NA, NA, NA, NA, "49383083", NA, ...
  31. ## $ mentions_screen_name <list> [NA, NA, NA, NA, NA, "ulrikeguerot", ...
  32. ## $ lang <chr> "en", "en", "en", "en", "en", "en", "e...
  33. ## $ quoted_status_id <chr> NA, NA, NA, NA, NA, NA, NA, NA, "10329...
  34. ## $ quoted_text <chr> NA, NA, NA, NA, NA, NA, NA, NA, "\"Rev...
  35. ## $ quoted_created_at <dttm> NA, NA, NA, NA, NA, NA, NA, NA, 2018-...
  36. ## $ quoted_source <chr> NA, NA, NA, NA, NA, NA, NA, NA, "Twitt...
  37. ## $ quoted_favorite_count <int> NA, NA, NA, NA, NA, NA, NA, NA, 12, NA...
  38. ## $ quoted_retweet_count <int> NA, NA, NA, NA, NA, NA, NA, NA, 3, NA,...
  39. ## $ quoted_user_id <chr> NA, NA, NA, NA, NA, NA, NA, NA, "18984...
  40. ## $ quoted_screen_name <chr> NA, NA, NA, NA, NA, NA, NA, NA, "Lafle...
  41. ## $ quoted_name <chr> NA, NA, NA, NA, NA, NA, NA, NA, "Jean-...
  42. ## $ quoted_followers_count <int> NA, NA, NA, NA, NA, NA, NA, NA, 497, N...
  43. ## $ quoted_friends_count <int> NA, NA, NA, NA, NA, NA, NA, NA, 356, N...
  44. ## $ quoted_statuses_count <int> NA, NA, NA, NA, NA, NA, NA, NA, 335, N...
  45. ## $ quoted_location <chr> NA, NA, NA, NA, NA, NA, NA, NA, "Belgi...
  46. ## $ quoted_description <chr> NA, NA, NA, NA, NA, NA, NA, NA, "Assoc...
  47. ## $ quoted_verified <lgl> NA, NA, NA, NA, NA, NA, NA, NA, FALSE,...
  48. ## $ retweet_status_id <chr> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA...
  49. ## $ retweet_text <chr> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA...
  50. ## $ retweet_created_at <dttm> NA, NA, NA, NA, NA, NA, NA, NA, NA, N...
  51. ## $ retweet_source <chr> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA...
  52. ## $ retweet_favorite_count <int> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA...
  53. ## $ retweet_retweet_count <int> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA...
  54. ## $ retweet_user_id <chr> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA...
  55. ## $ retweet_screen_name <chr> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA...
  56. ## $ retweet_name <chr> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA...
  57. ## $ retweet_followers_count <int> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA...
  58. ## $ retweet_friends_count <int> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA...
  59. ## $ retweet_statuses_count <int> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA...
  60. ## $ retweet_location <chr> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA...
  61. ## $ retweet_description <chr> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA...
  62. ## $ retweet_verified <lgl> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA...
  63. ## $ place_url <chr> NA, NA, NA, NA, NA, NA, NA, NA, "https...
  64. ## $ place_name <chr> NA, NA, NA, NA, NA, NA, NA, NA, "Hambu...
  65. ## $ place_full_name <chr> NA, NA, NA, NA, NA, NA, NA, NA, "Hambu...
  66. ## $ place_type <chr> NA, NA, NA, NA, NA, NA, NA, NA, "city"...
  67. ## $ country <chr> NA, NA, NA, NA, NA, NA, NA, NA, "Germa...
  68. ## $ country_code <chr> NA, NA, NA, NA, NA, NA, NA, NA, "DE", ...
  69. ## $ geo_coords <list> [<NA, NA>, <NA, NA>, <NA, NA>, <NA, N...
  70. ## $ coords_coords <list> [<NA, NA>, <NA, NA>, <NA, NA>, <NA, N...
  71. ## $ bbox_coords <list> [<NA, NA, NA, NA, NA, NA, NA, NA>, <N...
  72. ## $ status_url <chr> "https://twitter.com/akreppel/status/1...
  73. ## $ name <chr> "(((Amie Kreppel)))", "(((Amie Kreppel...
  74. ## $ location <chr> "Florida, USA", "Florida, USA", "Flori...
  75. ## $ description <chr> "Jean Monnet Chair and Associate Profe...
  76. ## $ url <chr> NA, NA, NA, NA, "https://t.co/MslGy2Ml...
  77. ## $ protected <lgl> FALSE, FALSE, FALSE, FALSE, FALSE, FAL...
  78. ## $ followers_count <int> 296, 296, 296, 296, 1245, 1245, 1245, ...
  79. ## $ friends_count <int> 355, 355, 355, 355, 475, 475, 475, 475...
  80. ## $ listed_count <int> 12, 12, 12, 12, 85, 85, 85, 85, 109, 1...
  81. ## $ statuses_count <int> 2789, 2789, 2789, 2789, 8805, 8805, 88...
  82. ## $ favourites_count <int> 3980, 3980, 3980, 3980, 0, 0, 0, 0, 24...
  83. ## $ account_created_at <dttm> 2009-02-26 01:23:21, 2009-02-26 01:23...
  84. ## $ verified <lgl> FALSE, FALSE, FALSE, FALSE, FALSE, FAL...
  85. ## $ profile_url <chr> NA, NA, NA, NA, "https://t.co/MslGy2Ml...
  86. ## $ profile_expanded_url <chr> NA, NA, NA, NA, "http://www.jaruizso.e...
  87. ## $ account_lang <chr> "en", "en", "en", "en", "en", "en", "e...
  88. ## $ profile_banner_url <chr> "https://pbs.twimg.com/profile_banners...
  89. ## $ profile_background_url <chr> "http://abs.twimg.com/images/themes/th...
  90. ## $ profile_image_url <chr> "http://pbs.twimg.com/profile_images/2...

The top ten retweeted tweets.

  1. # load("rt.Rdata")
  2. rt %>%
  3. select(screen_name, text, retweet_count) %>%
  4. filter(!str_detect(text, "^RT")) %>%
  5. mutate(text = str_replace_all(text, "\\\n", " ")) %>%
  6. arrange(desc(retweet_count)) %>%
  7. top_n(n = 10) %>%
  8. knitr::kable(., format = "markdown")
screen_name text retweet_count
jrteruel Cataluña y Escocia no son tan parecidas! Un análisis de discurso halla notables diferencias entre independentismos: recurrente retórica populista en Cat, pero no en Esc. Interesante esto d @josejolivas presentado en el panel de @_ignaciomolina https://t.co/DuGF8ppfq6 #ecprconf18 https://t.co/OAh4CMMlqc 64
policy_politics A special issue challenging scholars of policy theory to change the way they produce and communicate research. Read it for free until 20 September: https://t.co/iaMl4s08C6 #ecprconf18 @ECPR @CairneyPaul @chris_weible https://t.co/TsQBSlfN6T 27
DelDemUCan The countdown begins for the #ecprconf18 in Hamburg! Section conveners @NicoleCurato & @_SofieMarien put together a schedule of democratic innovations panels here. Check it out https://t.co/e8PVzo8foA https://t.co/kfEwLE6swv 23
BJPolS We are pleased to offer free access to a selection of the most-cited BJPolS articles until the end of 2018: https://t.co/G2wKHDnTdL #ecprconf18 https://t.co/rR7uPOwgCS 20
antje_wiener Delighted to see the book published: #Contestation and #Constitution of #Norms in #GlobalIR ⁦ ⁦@CUP_PoliSci⁩ ⁦@CUP_Law⁩ ⁦@InternatlTheory⁩ ⁦@JacquiTrue@SassanGholiagha⁩ ⁦@JuttaBrunnee@womenalsoknow⁩ #ecprconf18 https://t.co/IbZUclVRpd 19
CUP_PoliSci Do you want to know what to do with your first book proposal? Read a series of blog posts from a @CambridgeUP Publisher: https://t.co/vGFEmb3r48 #ecprconf18 https://t.co/Z34hmGWfSe 18
ECPR Are you joining us at the University of Hamburg for #ecprconf18? Rejoice! The printed programme is now available to view online https://t.co/GN8e81PaXx https://t.co/4lZBbhLxV0 16
LauraSeelkopf And here is the detailed programme of our section on the politics of taxation #ecprconf18 : come and listen to 7 panels with 32 papers written by 48 scholars from 40 different institutions and four continents https://t.co/1ZcM1No3ck 14
sarahcpolitics Presenting at #ecprconf18 paper on political protest in the context of the global financial crisis. I find the crisis triggered mobilisations, but depressed participation trends more broadly. Saturday 2pm VMP 5, Rm 2067. @ValuesStudies. Download the paper: https://t.co/TlPdTydQdf https://t.co/PzzAPiPrYp 14
kimgron The #ecprconf18 starts on Thursday in Hamburg. We have a full #DemInno section 👍 Also, don’t miss the Standing Group on Democratic Innovations meeting on Friday at 1 pm, Building VMP 8, Room 105. Steering Committee candidates will present themselves there, election in September 14

Timeline

What was the best time to tweet?

  1. rt %>%
  2. ## parse date format
  3. mutate(
  4. cdate = created_at %>%
  5. str_extract("\\d{4}-\\d{2}-\\d{2}") %>%
  6. lubridate::ymd(),
  7. hour = lubridate::hour(created_at)
  8. ) %>%
  9. ## select relevant time period
  10. filter(cdate >= as.Date("2018-08-23")) %>%
  11. ## count tweet per and and hour
  12. group_by(cdate, hour) %>%
  13. tally %>%
  14. ungroup %>%
  15. ggplot(aes(hour, n)) +
  16. geom_line() +
  17. ## split the visualization
  18. facet_wrap(~cdate, ncol = 1) +
  19. theme_minimal() +
  20. ggtitle("Number of Tweets by Day and Hour") +
  21. xlab("Hour of the Day") +
  22. ylab("Number of Tweets")

Mentions Network

  1. rt_graph <- rt %>%
  2. ## select relevant variables
  3. dplyr::select(screen_name, mentions_screen_name) %>%
  4. ## unnest list of mentions_screen_name
  5. unnest %>%
  6. ## count the number of coocurences
  7. group_by(screen_name, mentions_screen_name) %>%
  8. tally(sort = T) %>%
  9. ungroup %>%
  10. ## drop missing values
  11. drop_na %>%
  12. ## filter those coocurences that appear at least 2 times
  13. filter(n > 1) %>%
  14. ## transforming the dataframe to a graph object
  15. as_tbl_graph() %>%
  16. ## calculating node centrality
  17. mutate(popularity = centrality_degree(mode = 'in'))
  18. rt_graph %>%
  19. ## create graph layout
  20. ggraph(layout = "kk") +
  21. ## define edge aestetics
  22. geom_edge_fan(aes(alpha = n, edge_width = n, color = n)) +
  23. ## scale down link saturation
  24. scale_edge_alpha(range = c(.5, .9)) +
  25. ## define note size param
  26. scale_edge_color_gradient(low = "gray50", high = "#1874CD") +
  27. geom_node_point(aes(size = popularity), color = "gray30") +
  28. ## equal width and height
  29. coord_fixed() +
  30. ## plain theme
  31. theme_void() +
  32. ## title
  33. ggtitle("#ecprconf18 Twitter Mentions Network")

  1. rt_graph %>%
  2. ## create graph layout
  3. ggraph(layout = "kk") +
  4. ## define edge aestetics
  5. geom_edge_fan(aes(alpha = n, edge_width = n, color = n)) +
  6. ## scale down link saturation
  7. scale_edge_alpha(range = c(.5, .9)) +
  8. ## define note size param
  9. scale_edge_color_gradient(low = "gray50", high = "#1874CD") +
  10. geom_node_point(aes(size = popularity), color = "gray30") +
  11. ## define node labels
  12. geom_node_text(aes(label = name), repel = T, fontface = "bold") +
  13. ## equal width and height
  14. coord_fixed() +
  15. ## plain theme
  16. theme_void() +
  17. ## title
  18. ggtitle("#ecprconf18 Twitter Mentions Network")

  1. rt_graph %>%
  2. ## create graph layout
  3. ggraph(layout = "circle") +
  4. ## define edge aestetics
  5. geom_edge_fan(aes(alpha = n, edge_width = n, color = n)) +
  6. ## scale down link saturation
  7. scale_edge_alpha(range = c(.5, .9)) +
  8. ## define note size param
  9. scale_edge_color_gradient(low = "gray50", high = "#1874CD") +
  10. geom_node_point(aes(size = popularity), color = "gray30") +
  11. ## define node labels
  12. geom_node_text(aes(label = name), repel = F, fontface = "bold") +
  13. ## equal width and height
  14. coord_fixed() +
  15. ## plain theme
  16. theme_void() +
  17. ## title
  18. ggtitle("#ecprconf18 Twitter Mentions Network")

Smaller Mentions Network (n > 2)

  1. rt_graph2 <- rt %>%
  2. ## select relevant variables
  3. dplyr::select(screen_name, mentions_screen_name) %>%
  4. ## unnest list of mentions_screen_name
  5. unnest %>%
  6. ## count the number of coocurences
  7. group_by(screen_name, mentions_screen_name) %>%
  8. tally(sort = T) %>%
  9. ungroup %>%
  10. ## drop missing values
  11. drop_na %>%
  12. ## filter those coocurences that appear at least 2 times
  13. filter(n > 2) %>%
  14. ## transforming the dataframe to a graph object
  15. as_tbl_graph() %>%
  16. ## calculating node centrality
  17. mutate(popularity = centrality_degree(mode = 'in'))
  18. rt_graph2 %>%
  19. ## create graph layout
  20. ggraph(layout = "kk") +
  21. ## define edge aestetics
  22. geom_edge_fan(aes(alpha = n, edge_width = n, color = n)) +
  23. ## scale down link saturation
  24. scale_edge_alpha(range = c(.5, .9)) +
  25. ## define note size param
  26. scale_edge_color_gradient(low = "gray50", high = "#1874CD") +
  27. geom_node_point(aes(size = popularity), color = "gray30") +
  28. ## equal width and height
  29. coord_fixed() +
  30. geom_node_text(aes(label = name), repel = T, fontface = "bold") +
  31. ## plain theme
  32. theme_void() +
  33. ## title
  34. ggtitle("#ecprconf18 Twitter Mentions Network")

Most Frequent Hashtags

  1. rt_hashtags <- rt %>%
  2. select(hashtags) %>%
  3. ## unnest list of hastags
  4. unnest %>%
  5. na.omit %>%
  6. ## clean hashtags
  7. mutate(hashtags = stringr::str_to_lower(hashtags) %>%
  8. str_replace_all("2018", "18") %>%
  9. ## add #symbol to vector
  10. paste0("#", .)) %>%
  11. ## count each hashtag and sort
  12. count(hashtags, sort = T) %>%
  13. filter(n > 5)
  14. rt_hashtags %>%
  15. filter(hashtags != "#ecprconf18") %>%
  16. mutate(hashtags = forcats::fct_reorder(hashtags, n)) %>%
  17. ggplot(aes(hashtags, n)) +
  18. geom_bar(stat = "identity", alpha = .7) +
  19. coord_flip() +
  20. theme_minimal() +
  21. ggtitle("Most Frequent Hastags related to #ecprconf18")

Most Frequent Bigram Network

  1. gg_bigram <- rt %>%
  2. select(text) %>%
  3. ## remove text noise
  4. mutate(text = stringr::str_remove_all(text, "w |amp ")) %>%
  5. ## remove retweets
  6. filter(!stringr::str_detect(text, "^RT")) %>%
  7. ## remove urls
  8. mutate(text = stringr::str_remove_all(text, "https?[:]//[[:graph:]]+")) %>%
  9. mutate(id = 1:n()) %>%
  10. ## split text into words
  11. tidytext::unnest_tokens(word, text, token = "words") %>%
  12. ## remove stop words
  13. anti_join(tidytext::stop_words) %>%
  14. ## paste words to text by id
  15. group_by(id) %>%
  16. summarise(text = paste(word, collapse = " ")) %>%
  17. ungroup %>%
  18. ## again split text into bigrams (word occurences or collocations)
  19. tidytext::unnest_tokens(bigram, text, token = "ngrams", n = 2) %>%
  20. separate(bigram, c("word1", "word2"), sep = " ") %>%
  21. ## remove the hashtag and count bigrams
  22. filter(word1 != "ecprconf18", word2 != "ecprconf18") %>%
  23. count(word1, word2, sort = T) %>%
  24. ## select first 100
  25. slice(1:100) %>%
  26. drop_na() %>%
  27. ## create tidy graph object
  28. as_tbl_graph() %>%
  29. ## calculate node centrality
  30. mutate(Popularity = centrality_degree(mode = 'in'))
  1. gg_bigram %>%
  2. ggraph() +
  3. geom_edge_link(aes(edge_alpha = n, edge_width = n)) +
  4. geom_node_point(aes(size = Popularity)) +
  5. geom_node_text(aes(label = name), repel = TRUE) +
  6. theme_void() +
  7. scale_edge_alpha("", range = c(0.3, .6)) +
  8. ggtitle("Top Bigram Network from Tweets using hashtag #ecprconf18")

  1. sessionInfo()
  1. ## R version 3.5.0 (2018-04-23)
  2. ## Platform: x86_64-w64-mingw32/x64 (64-bit)
  3. ## Running under: Windows 10 x64 (build 17134)
  4. ##
  5. ## Matrix products: default
  6. ##
  7. ## locale:
  8. ## [1] LC_COLLATE=German_Germany.1252 LC_CTYPE=German_Germany.1252
  9. ## [3] LC_MONETARY=German_Germany.1252 LC_NUMERIC=C
  10. ## [5] LC_TIME=German_Germany.1252
  11. ##
  12. ## attached base packages:
  13. ## [1] stats graphics grDevices utils datasets methods base
  14. ##
  15. ## other attached packages:
  16. ## [1] bindrcpp_0.2.2 tidygraph_1.1.0 igraph_1.2.1
  17. ## [4] ggraph_1.0.1.9999 rtweet_0.6.7.9000 forcats_0.3.0
  18. ## [7] stringr_1.3.0 dplyr_0.7.5 purrr_0.2.4
  19. ## [10] readr_1.1.1 tidyr_0.8.1 tibble_1.4.2
  20. ## [13] ggplot2_3.0.0.9000 tidyverse_1.2.1
  21. ##
  22. ## loaded via a namespace (and not attached):
  23. ## [1] ggrepel_0.8.0 Rcpp_0.12.18 lubridate_1.7.4
  24. ## [4] lattice_0.20-35 assertthat_0.2.0 rprojroot_1.3-2
  25. ## [7] digest_0.6.15 psych_1.8.3.3 ggforce_0.1.3
  26. ## [10] R6_2.2.2 cellranger_1.1.0 plyr_1.8.4
  27. ## [13] backports_1.1.2 evaluate_0.10.1 highr_0.6
  28. ## [16] httr_1.3.1 pillar_1.2.1 rlang_0.2.1
  29. ## [19] lazyeval_0.2.1 readxl_1.1.0 rstudioapi_0.7
  30. ## [22] Matrix_1.2-14 rmarkdown_1.9 labeling_0.3
  31. ## [25] tidytext_0.1.9 foreign_0.8-70 munsell_0.4.3
  32. ## [28] broom_0.4.4 janeaustenr_0.1.5 compiler_3.5.0
  33. ## [31] modelr_0.1.1 pkgconfig_2.0.1 mnormt_1.5-5
  34. ## [34] htmltools_0.3.6 tidyselect_0.2.4 gridExtra_2.3
  35. ## [37] viridisLite_0.3.0 crayon_1.3.4 withr_2.1.2
  36. ## [40] SnowballC_0.5.1 MASS_7.3-49 grid_3.5.0
  37. ## [43] nlme_3.1-137 jsonlite_1.5 gtable_0.2.0
  38. ## [46] pacman_0.4.6 magrittr_1.5 tokenizers_0.2.1
  39. ## [49] units_0.6-0 scales_0.5.0 cli_1.0.0
  40. ## [52] stringi_1.1.7 farver_1.0 reshape2_1.4.3
  41. ## [55] viridis_0.5.1 xml2_1.2.0 tools_3.5.0
  42. ## [58] glue_1.3.0 tweenr_0.1.5.9999 hms_0.4.2
  43. ## [61] parallel_3.5.0 yaml_2.1.19 colorspace_1.4-0
  44. ## [64] rvest_0.3.2 knitr_1.20 bindr_0.1.1
  45. ## [67] haven_1.1.2