Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #This script creates a network of Twitter mentions and retweets
- #It collects all tweets from the 2013 American Sociological Association with the hashtag #asa2013 or #asa13.
- #Tweets without any relationship to another user of the hashtag are discarded.
- #Twitter users mentioned who, if never they used the hashtags themselves, are also discarded
- #The data was collected by Alex Hanna (https://twitter.com/alexhanna)
- #I have reuploaded the data to pastein, however the original data can be found at:
- #https://docs.google.com/spreadsheet/ccc?key=0Avriupr1jL4kdGxCOWlTZ3NWN28wTFFWcFRBV0l2UlE#gid=0
- #The code below was written by Benjamin Lind (https://twitter.com/benjaminlind)
- #Creative Commons [CC] license: BY-NC-SA 3.0
- #This script may be loaded remotely using the following commands:
- #library(RCurl)
- #dl.data<-getURL("http://pastebin.com/raw.php?i=dY4VMMiF", ssl.verifypeer=FALSE)
- #dl.data<-textConnection(dl.data)
- #source(dl.data)
- #rm(dl.data)
- library(RCurl)
- library(igraph)
- library(compiler)
- su<-function(x)
- return(sort(unique(x)))
- su<-cmpfun(su)
- read.sstab<-function(theurl, ...){ #Function to read in a data table from online
- #_theurl_ refers to the location of the data
- #_..._ are parameters passed onto read.table
- require(RCurl)
- outtab<-getURL(theurl, ssl.verifypeer=FALSE)
- outtab<-textConnection(outtab)
- outtab<-read.table(outtab, sep="\t", ...)
- return(outtab)
- }
- dat<-read.sstab("http://pastebin.com/raw.php?i=CXjvtYZt", header=TRUE, as.is=TRUE, stringsAsFactors=FALSE, strip.white=TRUE, comment.char="", quote="")
- dat<-dat[-which(dat$user.screen_name==""),] #Cleaning up
- tweeters<-su(dat$user.screen_name) #Get a list of the user names
- tweeters.mentioned<-lapply(tweeters, grep, x=dat$text) #Get a list of mentioned for each tweeter
- names(tweeters.mentioned)<-tweeters #Name the list
- cols.interest<-c("user.screen_name", "created_at", "id", "text", "rt.id", "rt.created_at") #The columns I'm interested in
- ret.edge.info<-function(ind, d=dat)
- return(d[ind, cols.interest])
- ret.edge.info<-cmpfun(ret.edge.info)
- el.make<-function(sn, l=tweeters.mentioned){ #Generates the edgelist
- colnames.mat<-c("sender", "receiver", "time", "id", "text", "rt.id", "rt.time")
- if (length(l[[sn]])==0){ #Send out NA vector if person is never mentioned
- ret.vals<-matrix(NA, nrow=1, ncol=length(colnames.mat), dimnames=list("1", colnames.mat))
- return(ret.vals)
- }
- else{
- ret.vals<-lapply(l[[sn]], ret.edge.info)
- ret.vals<-do.call(rbind, ret.vals)
- ret.vals<-as.matrix(ret.vals)
- if (nrow(ret.vals)==1){ #Ensure that it returns a matrix, not a vector
- ret.vals<-c(sender=ret.vals[,"user.screen_name"], receiver=sn, ret.vals[c("created_at", "id", "text", "rt.id", "rt.created_at")])
- ret.vals<-matrix(ret.vals, nrow=1, ncol=length(ret.vals), dimnames=list(1, colnames.mat))
- }
- else{
- ret.vals<-cbind(sender=ret.vals[,"user.screen_name"], receiver=rep(sn, times=nrow(ret.vals)), ret.vals[, c("created_at", "id", "text", "rt.id", "rt.created_at")])
- ret.vals<-as.matrix(ret.vals, dimnames=list(1, colnames.mat))
- }
- return(ret.vals)
- }
- }; el.make<-cmpfun(el.make)
- tweeter.el<-lapply(tweeters, el.make)
- tweeter.el<-do.call(rbind, tweeter.el)
- tweeter.el<-as.data.frame(tweeter.el)
- tweeter.el$rt.id<-as.numeric(tweeter.el$rt.id) #Convert from character to numeric
- tweeter.el$id<-as.numeric(tweeter.el$id) #Convert from character to numeric
- tweet.date<-as.numeric(as.Date(tweeter.el$time, "%m/%d/%Y %H:%M:%S")) #Numeric date
- tweet.rt.date<-as.numeric(as.Date(tweeter.el$rt.time, "%m/%d/%Y %H:%M:%S")) #Numeric date
- tweeter.el<-cbind(tweeter.el, time.num=tweet.date, rt.time.num=tweet.rt.date, is.rt=is.na(tweeter.el$rt.id)==FALSE) #Add new, numeric date vectors, along with RT logical vector
- tweeter.el<-tweeter.el[-which(is.na(tweeter.el$sender)&is.na(tweeter.el$receiver)),] #Remove those without mentions
- tweeter.ig<-graph.edgelist(as.matrix(tweeter.el[, c("sender", "receiver")])) #Turn to edgelist igraph
- for (i in 3:ncol(tweeter.el)) #Add edge attributes
- tweeter.ig<-set.edge.attribute(tweeter.ig, name=colnames(tweeter.el)[i], value=tweeter.el[,i])
- unmentioned<-tweeters[which(tweeters %in% V(tweeter.ig)$name==FALSE)] #Who tweeted, but wasn't mentioned?
- tweeter.ig<-add.vertices(tweeter.ig, nv=length(unmentioned)) #Add isolates
- V(tweeter.ig)$name[which(is.na(V(tweeter.ig)$name))]<-unmentioned
- #Set the vertex attributes
- dat.mini<-dat[which(duplicated(dat$user.screen_name)==FALSE), c("user.screen_name", "user.id", "user.name")]
- V(tweeter.ig)$user.id<-dat.mini[match(V(tweeter.ig)$name, dat.mini[,"user.screen_name"]), "user.id"]
- V(tweeter.ig)$user.name<-dat.mini[match(V(tweeter.ig)$name, dat.mini[,"user.screen_name"]), "user.name"]
- rm(su, read.sstab, dat, tweeters.mentioned, ret.edge.info, cols.interest, el.make, tweet.date, tweet.rt.date, i, unmentioned, dat.mini, tweeter.el, tweeters) #Clean-up
Advertisement
Add Comment
Please, Sign In to add comment