library(tidyverse)
library(DT)
library(igraph)
library(rtweet)
library(visNetwork)
library(graphTweets)            
  1. Here are the last 300 tweets from each member of the US Senate twitter list.
senate <- lists_members(slug = "us-senate", owner_user = "TwitterGov")

senate_tweets <- get_timeline(senate$screen_name, n = 300)
Warning: Rate limit exceeded - 88
Warning: rate limit exceeded.  mins until rate limit resets.
Warning: Rate limit exceeded - 88
Warning: rate limit exceeded.  mins until rate limit resets.
Warning: Rate limit exceeded - 88
Warning: rate limit exceeded.  mins until rate limit resets.
Warning: Rate limit exceeded - 88
Warning: rate limit exceeded.  mins until rate limit resets.
Warning: Rate limit exceeded - 88
Warning: rate limit exceeded.  mins until rate limit resets.
Warning: Rate limit exceeded - 88
Warning: rate limit exceeded.  mins until rate limit resets.
Warning: Rate limit exceeded - 88
Warning: rate limit exceeded.  mins until rate limit resets.
Warning: Rate limit exceeded - 88
Warning: rate limit exceeded.  mins until rate limit resets.
Warning: Rate limit exceeded - 88
Warning: rate limit exceeded.  mins until rate limit resets.
Warning: Rate limit exceeded - 88
Warning: rate limit exceeded.  mins until rate limit resets.
Warning: Rate limit exceeded - 88
Warning: rate limit exceeded.  mins until rate limit resets.
Warning: Rate limit exceeded - 88
Warning: rate limit exceeded.  mins until rate limit resets.
Warning: Rate limit exceeded - 88
Warning: rate limit exceeded.  mins until rate limit resets.
Warning: Rate limit exceeded - 88
Warning: rate limit exceeded.  mins until rate limit resets.
Warning: Rate limit exceeded - 88
Warning: rate limit exceeded.  mins until rate limit resets.
Warning: Rate limit exceeded - 88
Warning: rate limit exceeded.  mins until rate limit resets.
Warning: Rate limit exceeded - 88
Warning: rate limit exceeded.  mins until rate limit resets.
Warning: Rate limit exceeded - 88
Warning: rate limit exceeded.  mins until rate limit resets.
Warning: Rate limit exceeded - 88
Warning: rate limit exceeded.  mins until rate limit resets.
Warning: Rate limit exceeded - 88
Warning: rate limit exceeded.  mins until rate limit resets.
Warning: Rate limit exceeded - 88
Warning: rate limit exceeded.  mins until rate limit resets.
Warning: Rate limit exceeded - 88
Warning: rate limit exceeded.  mins until rate limit resets.
Warning: Rate limit exceeded - 88
Warning: rate limit exceeded.  mins until rate limit resets.
Warning: Rate limit exceeded - 88
Warning: rate limit exceeded.  mins until rate limit resets.
Warning: Rate limit exceeded - 88
Warning: rate limit exceeded.  mins until rate limit resets.
Warning: Rate limit exceeded - 88
Warning: rate limit exceeded.  mins until rate limit resets.
Warning: Rate limit exceeded - 88
Warning: rate limit exceeded.  mins until rate limit resets.
Warning: Rate limit exceeded - 88
Warning: rate limit exceeded.  mins until rate limit resets.
Warning: Rate limit exceeded - 88
Warning: rate limit exceeded.  mins until rate limit resets.
Warning: Rate limit exceeded - 88
Warning: rate limit exceeded.  mins until rate limit resets.
Warning: Rate limit exceeded - 88
Warning: rate limit exceeded.  mins until rate limit resets.
Warning: Rate limit exceeded - 88
Warning: rate limit exceeded.  mins until rate limit resets.
Warning: Rate limit exceeded - 88
Warning: rate limit exceeded.  mins until rate limit resets.
Warning: Rate limit exceeded - 88
Warning: rate limit exceeded.  mins until rate limit resets.
Warning: Rate limit exceeded - 88
Warning: rate limit exceeded.  mins until rate limit resets.
Warning: Rate limit exceeded - 88
Warning: rate limit exceeded.  mins until rate limit resets.
Warning: Rate limit exceeded - 88
Warning: rate limit exceeded.  mins until rate limit resets.
Warning: Rate limit exceeded - 88
Warning: rate limit exceeded.  mins until rate limit resets.
Warning: Rate limit exceeded - 88
Warning: rate limit exceeded.  mins until rate limit resets.
Warning: Rate limit exceeded - 88
Warning: rate limit exceeded.  mins until rate limit resets.

Ta-Da.

  1. Here is a network of retweets for the US Senate twitter list.

senate_retweets_network <- senate_tweets %>% 
  filter(retweet_screen_name %in% senate$screen_name) %>%    
  gt_edges(screen_name, retweet_screen_name, text) %>%            
  gt_graph()



senate_retweets_nodes <- as_data_frame(senate_retweets_network, what = "vertices")


senate_retweets_nodes <- senate_retweets_nodes %>% 
  mutate(id = name) %>% 
  mutate(label = name) %>% 
  mutate(title = name) %>% 
  mutate(degree = degree(senate_retweets_network)) %>% 
  mutate(value = degree)


senate_retweets_edges <- as_data_frame(senate_retweets_network, what = "edges")


senate_retweets_edges <- senate_retweets_edges %>% 
  mutate(title = text)


visNetwork(senate_retweets_nodes, senate_retweets_edges, main = "US Senate officials retweet network") %>% 
  visIgraphLayout(layout = "layout_nicely") %>% 
  visEdges(arrows = "to")

There are quite a few outliars from this network.

  1. Here is a count of nodes and edges, and get the density of the network.
senate_retweets_network %>% 
  vcount()
[1] 170
senate_retweets_network %>% 
  ecount()
[1] 1631
senate_retweets_network %>% 
  edge_density()
[1] 0.05676993

This network’s density is less than one tenth.

  1. Here is a data table of the list members, showing only their names and degree.
senate_retweets_nodes %>%
  select(name,degree)

This Twitter list has 170 members which is a lot.

  1. Here are the communities shown in a diagram.
senate_retweets_nodes <- senate_retweets_nodes %>% 
  mutate(group = membership(infomap.community(senate_retweets_network)))
Modularity is implemented for undirected graphs only.
visNetwork(senate_retweets_nodes, senate_retweets_edges, main = "US Senate officials retweet network") %>% 
  visIgraphLayout(layout = "layout_nicely") %>% 
  visEdges(arrows = "to") %>%   
  visOptions(highlightNearest = T, nodesIdSelection = T, selectedBy = "group")
NA
NA

Orange appears to be the largest community in this network.

LS0tDQp0aXRsZTogIkdyYXBoIFR3ZWV0cyINCm91dHB1dDogaHRtbF9ub3RlYm9vaw0KLS0tDQpgYGB7cn0NCmxpYnJhcnkodGlkeXZlcnNlKQ0KbGlicmFyeShEVCkNCmxpYnJhcnkoaWdyYXBoKQ0KbGlicmFyeShydHdlZXQpDQpsaWJyYXJ5KHZpc05ldHdvcmspDQpsaWJyYXJ5KGdyYXBoVHdlZXRzKSAgICAgICAgICAgIA0KDQpgYGANCg0KMS4gSGVyZSBhcmUgdGhlIGxhc3QgMzAwIHR3ZWV0cyBmcm9tIGVhY2ggbWVtYmVyIG9mIHRoZSBVUyBTZW5hdGUgdHdpdHRlciBsaXN0LiAgDQoNCg0KYGBge3J9DQpzZW5hdGUgPC0gbGlzdHNfbWVtYmVycyhzbHVnID0gInVzLXNlbmF0ZSIsIG93bmVyX3VzZXIgPSAiVHdpdHRlckdvdiIpDQoNCnNlbmF0ZV90d2VldHMgPC0gZ2V0X3RpbWVsaW5lKHNlbmF0ZSRzY3JlZW5fbmFtZSwgbiA9IDMwMCkNCg0KYGBgDQpUYS1EYS4NCg0KMi4gSGVyZSBpcyBhIG5ldHdvcmsgb2YgcmV0d2VldHMgZm9yIHRoZSBVUyBTZW5hdGUgdHdpdHRlciBsaXN0LiAgDQoNCmBgYHtyfQ0KDQpzZW5hdGVfcmV0d2VldHNfbmV0d29yayA8LSBzZW5hdGVfdHdlZXRzICU+JSANCiAgZmlsdGVyKHJldHdlZXRfc2NyZWVuX25hbWUgJWluJSBzZW5hdGUkc2NyZWVuX25hbWUpICU+JSAgICANCiAgZ3RfZWRnZXMoc2NyZWVuX25hbWUsIHJldHdlZXRfc2NyZWVuX25hbWUsIHRleHQpICU+JSAgICAgICAgICAgIA0KICBndF9ncmFwaCgpDQoNCg0KDQpzZW5hdGVfcmV0d2VldHNfbm9kZXMgPC0gYXNfZGF0YV9mcmFtZShzZW5hdGVfcmV0d2VldHNfbmV0d29yaywgd2hhdCA9ICJ2ZXJ0aWNlcyIpDQoNCg0Kc2VuYXRlX3JldHdlZXRzX25vZGVzIDwtIHNlbmF0ZV9yZXR3ZWV0c19ub2RlcyAlPiUgDQogIG11dGF0ZShpZCA9IG5hbWUpICU+JSANCiAgbXV0YXRlKGxhYmVsID0gbmFtZSkgJT4lIA0KICBtdXRhdGUodGl0bGUgPSBuYW1lKSAlPiUgDQogIG11dGF0ZShkZWdyZWUgPSBkZWdyZWUoc2VuYXRlX3JldHdlZXRzX25ldHdvcmspKSAlPiUgDQogIG11dGF0ZSh2YWx1ZSA9IGRlZ3JlZSkNCg0KDQpzZW5hdGVfcmV0d2VldHNfZWRnZXMgPC0gYXNfZGF0YV9mcmFtZShzZW5hdGVfcmV0d2VldHNfbmV0d29yaywgd2hhdCA9ICJlZGdlcyIpDQoNCg0Kc2VuYXRlX3JldHdlZXRzX2VkZ2VzIDwtIHNlbmF0ZV9yZXR3ZWV0c19lZGdlcyAlPiUgDQogIG11dGF0ZSh0aXRsZSA9IHRleHQpDQoNCg0KdmlzTmV0d29yayhzZW5hdGVfcmV0d2VldHNfbm9kZXMsIHNlbmF0ZV9yZXR3ZWV0c19lZGdlcywgbWFpbiA9ICJVUyBTZW5hdGUgb2ZmaWNpYWxzIHJldHdlZXQgbmV0d29yayIpICU+JSANCiAgdmlzSWdyYXBoTGF5b3V0KGxheW91dCA9ICJsYXlvdXRfbmljZWx5IikgJT4lIA0KICB2aXNFZGdlcyhhcnJvd3MgPSAidG8iKQ0KYGBgDQpUaGVyZSBhcmUgcXVpdGUgYSBmZXcgb3V0bGlhcnMgZnJvbSB0aGlzIG5ldHdvcmsuDQoNCg0KMy4gSGVyZSBpcyBhIGNvdW50IG9mIG5vZGVzIGFuZCBlZGdlcywgYW5kIGdldCB0aGUgZGVuc2l0eSBvZiB0aGUgbmV0d29yay4gDQoNCmBgYHtyfQ0Kc2VuYXRlX3JldHdlZXRzX25ldHdvcmsgJT4lIA0KICB2Y291bnQoKQ0KYGBgDQoNCmBgYHtyfQ0Kc2VuYXRlX3JldHdlZXRzX25ldHdvcmsgJT4lIA0KICBlY291bnQoKQ0KYGBgDQoNCmBgYHtyfQ0Kc2VuYXRlX3JldHdlZXRzX25ldHdvcmsgJT4lIA0KICBlZGdlX2RlbnNpdHkoKQ0KYGBgDQpUaGlzIG5ldHdvcmsncyBkZW5zaXR5IGlzIGxlc3MgdGhhbiBvbmUgdGVudGguDQoNCjQuIEhlcmUgaXMgYSBkYXRhIHRhYmxlIG9mIHRoZSBsaXN0IG1lbWJlcnMsIHNob3dpbmcgb25seSB0aGVpciBuYW1lcyBhbmQgZGVncmVlLiANCg0KYGBge3J9DQpzZW5hdGVfcmV0d2VldHNfbm9kZXMgJT4lDQogIHNlbGVjdChuYW1lLGRlZ3JlZSkNCmBgYA0KVGhpcyBUd2l0dGVyIGxpc3QgaGFzIDE3MCBtZW1iZXJzIHdoaWNoIGlzIGEgbG90Lg0KDQoNCjUuIEhlcmUgYXJlIHRoZSBjb21tdW5pdGllcyBzaG93biBpbiBhIGRpYWdyYW0uIA0KDQpgYGB7cn0NCnNlbmF0ZV9yZXR3ZWV0c19ub2RlcyA8LSBzZW5hdGVfcmV0d2VldHNfbm9kZXMgJT4lIA0KICBtdXRhdGUoZ3JvdXAgPSBtZW1iZXJzaGlwKGluZm9tYXAuY29tbXVuaXR5KHNlbmF0ZV9yZXR3ZWV0c19uZXR3b3JrKSkpDQoNCnZpc05ldHdvcmsoc2VuYXRlX3JldHdlZXRzX25vZGVzLCBzZW5hdGVfcmV0d2VldHNfZWRnZXMsIG1haW4gPSAiVVMgU2VuYXRlIG9mZmljaWFscyByZXR3ZWV0IG5ldHdvcmsiKSAlPiUgDQogIHZpc0lncmFwaExheW91dChsYXlvdXQgPSAibGF5b3V0X25pY2VseSIpICU+JSANCiAgdmlzRWRnZXMoYXJyb3dzID0gInRvIikgJT4lICAgDQogIHZpc09wdGlvbnMoaGlnaGxpZ2h0TmVhcmVzdCA9IFQsIG5vZGVzSWRTZWxlY3Rpb24gPSBULCBzZWxlY3RlZEJ5ID0gImdyb3VwIikNCg0KDQpgYGANCk9yYW5nZSBhcHBlYXJzIHRvIGJlIHRoZSBsYXJnZXN0IGNvbW11bml0eSBpbiB0aGlzIG5ldHdvcmsuDQoNCg==