BenjaminLind

Create igraph object from #asa2013 and #asa13

Aug 23rd, 2013
289
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
R 4.88 KB | None | 0 0
  1. #This script creates a network of Twitter mentions and retweets
  2. #It collects all tweets from the 2013 American Sociological Association with the hashtag #asa2013 or #asa13.
  3. #Tweets without any relationship to another user of the hashtag are discarded.
  4. #Twitter users mentioned who, if never they used the hashtags themselves, are also discarded
  5.  
  6. #The data was collected by Alex Hanna (https://twitter.com/alexhanna)
  7. #I have reuploaded the data to pastein, however the original data can be found at:
  8. #https://docs.google.com/spreadsheet/ccc?key=0Avriupr1jL4kdGxCOWlTZ3NWN28wTFFWcFRBV0l2UlE#gid=0
  9.  
  10. #The code below was written by Benjamin Lind (https://twitter.com/benjaminlind)
  11. #Creative Commons [CC] license: BY-NC-SA 3.0
  12.  
  13.  
  14. #This script may be loaded remotely using the following commands:
  15. #library(RCurl)
  16. #dl.data<-getURL("http://pastebin.com/raw.php?i=dY4VMMiF", ssl.verifypeer=FALSE)
  17. #dl.data<-textConnection(dl.data)
  18. #source(dl.data)
  19. #rm(dl.data)
  20.  
  21. library(RCurl)
  22. library(igraph)
  23. library(compiler)
  24.  
  25. su<-function(x)
  26.   return(sort(unique(x)))
  27. su<-cmpfun(su)
  28.  
  29. read.sstab<-function(theurl, ...){ #Function to read in a data table from online
  30.   #_theurl_ refers to the location of the data
  31.   #_..._ are parameters passed onto read.table
  32.   require(RCurl)
  33.   outtab<-getURL(theurl, ssl.verifypeer=FALSE)
  34.   outtab<-textConnection(outtab)
  35.   outtab<-read.table(outtab, sep="\t", ...)
  36.   return(outtab)
  37.   }
  38.  
  39. dat<-read.sstab("http://pastebin.com/raw.php?i=CXjvtYZt", header=TRUE, as.is=TRUE, stringsAsFactors=FALSE, strip.white=TRUE, comment.char="", quote="")
  40.  
  41. dat<-dat[-which(dat$user.screen_name==""),] #Cleaning up
  42. tweeters<-su(dat$user.screen_name) #Get a list of the user names
  43.  
  44. tweeters.mentioned<-lapply(tweeters, grep, x=dat$text) #Get a list of mentioned for each tweeter
  45. names(tweeters.mentioned)<-tweeters #Name the list
  46.  
  47. cols.interest<-c("user.screen_name", "created_at", "id", "text", "rt.id", "rt.created_at") #The columns I'm interested in
  48. ret.edge.info<-function(ind, d=dat)
  49.   return(d[ind, cols.interest])
  50. ret.edge.info<-cmpfun(ret.edge.info)
  51.  
  52. el.make<-function(sn, l=tweeters.mentioned){ #Generates the edgelist
  53.   colnames.mat<-c("sender", "receiver", "time", "id", "text", "rt.id", "rt.time")
  54.   if (length(l[[sn]])==0){ #Send out NA vector if person is never mentioned
  55.     ret.vals<-matrix(NA, nrow=1, ncol=length(colnames.mat), dimnames=list("1", colnames.mat))
  56.     return(ret.vals)
  57.     }
  58.   else{
  59.     ret.vals<-lapply(l[[sn]], ret.edge.info)
  60.     ret.vals<-do.call(rbind, ret.vals)
  61.     ret.vals<-as.matrix(ret.vals)
  62.     if (nrow(ret.vals)==1){ #Ensure that it returns a matrix, not a vector
  63.       ret.vals<-c(sender=ret.vals[,"user.screen_name"], receiver=sn, ret.vals[c("created_at", "id", "text", "rt.id", "rt.created_at")])
  64.        ret.vals<-matrix(ret.vals, nrow=1, ncol=length(ret.vals), dimnames=list(1, colnames.mat))
  65.        }
  66.     else{
  67.       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")])
  68.       ret.vals<-as.matrix(ret.vals, dimnames=list(1, colnames.mat))
  69.       }
  70.     return(ret.vals)
  71.     }
  72.   }; el.make<-cmpfun(el.make)
  73.  
  74. tweeter.el<-lapply(tweeters, el.make)
  75. tweeter.el<-do.call(rbind, tweeter.el)
  76. tweeter.el<-as.data.frame(tweeter.el)
  77. tweeter.el$rt.id<-as.numeric(tweeter.el$rt.id) #Convert from character to numeric
  78. tweeter.el$id<-as.numeric(tweeter.el$id) #Convert from character to numeric
  79. tweet.date<-as.numeric(as.Date(tweeter.el$time, "%m/%d/%Y %H:%M:%S"))  #Numeric date
  80. tweet.rt.date<-as.numeric(as.Date(tweeter.el$rt.time, "%m/%d/%Y %H:%M:%S")) #Numeric date
  81. 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
  82. tweeter.el<-tweeter.el[-which(is.na(tweeter.el$sender)&is.na(tweeter.el$receiver)),] #Remove those without mentions
  83.  
  84. tweeter.ig<-graph.edgelist(as.matrix(tweeter.el[, c("sender", "receiver")])) #Turn to edgelist igraph
  85. for (i in 3:ncol(tweeter.el)) #Add edge attributes
  86.   tweeter.ig<-set.edge.attribute(tweeter.ig, name=colnames(tweeter.el)[i], value=tweeter.el[,i])
  87. unmentioned<-tweeters[which(tweeters %in% V(tweeter.ig)$name==FALSE)] #Who tweeted, but wasn't mentioned?
  88. tweeter.ig<-add.vertices(tweeter.ig, nv=length(unmentioned)) #Add isolates
  89. V(tweeter.ig)$name[which(is.na(V(tweeter.ig)$name))]<-unmentioned
  90. #Set the vertex attributes
  91. dat.mini<-dat[which(duplicated(dat$user.screen_name)==FALSE), c("user.screen_name", "user.id", "user.name")]
  92. V(tweeter.ig)$user.id<-dat.mini[match(V(tweeter.ig)$name, dat.mini[,"user.screen_name"]), "user.id"]
  93. V(tweeter.ig)$user.name<-dat.mini[match(V(tweeter.ig)$name, dat.mini[,"user.screen_name"]), "user.name"]
  94.  
  95. 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