如何在R中的twitteR包中提取tweet地理编码

时间:2012-07-26 17:35:40

标签: r twitter geocode

最近,Edwin Chen发布了一张关于苏打水与流行音乐的区域用法的精彩地图,以及通过地理编码推文在饮酒方面解决这些词语所创造的可乐。 http://blog.echen.me/2012/07/06/soda-vs-pop-with-twitter/

他提到他使用了Jeff Gentry在R中创建的twitteR软件包。当然,很容易收集使用给定单词并将它们放在数据框中的推文:

require(twitteR)
require(plyr)
cat.tweets<-searchTwitter("cats",n=1000)
tweets.df = ldply(cat.tweets, function(t) t$toDataFrame() ) 

数据框(tweets.df)将包含每条推文的用户ID,推文文本等,但似乎不包含地理编码。关于如何在R中获得它的任何想法?

3 个答案:

答案 0 :(得分:4)

地理编码是指经度和纬度坐标吗? 如果是,以下命令对我有效。

cat.tweets = searchTwitter("cats",n=1000)
tweets.df = do.call("rbind",lapply(cat.tweets,as.data.frame))

来源:LINK

答案 1 :(得分:3)

我一直在修改R功能,您输入搜索文本,搜索站点的数量以及每个站点周围的半径。例如twitterMap("#rstats",10,"10mi")这里是代码:

twitterMap <- function(searchtext,locations,radius){
require(ggplot2)
require(maps)
require(twitteR)
#radius from randomly chosen location
radius=radius
lat<-runif(n=locations,min=24.446667, max=49.384472)
long<-runif(n=locations,min=-124.733056, max=-66.949778)
#generate data fram with random longitude, latitude and chosen radius
coordinates<-as.data.frame(cbind(lat,long,radius))
coordinates$lat<-lat
coordinates$long<-long
#create a string of the lat, long, and radius for entry into searchTwitter()
for(i in 1:length(coordinates$lat)){
coordinates$search.twitter.entry[i]<-toString(c(coordinates$lat[i],
coordinates$long[i],radius))
}
# take out spaces in the string
coordinates$search.twitter.entry<-gsub(" ","", coordinates$search.twitter.entry ,
fixed=TRUE)

#Search twitter at each location, check how many tweets and put into dataframe
for(i in 1:length(coordinates$lat)){
coordinates$number.of.tweets[i]<-
 length(searchTwitter(searchString=searchtext,n=1000,geocode=coordinates$search.twitter.entry[i]))
}
#making the US map
all_states <- map_data("state")
#plot all points on the map
p <- ggplot()
p <- p + geom_polygon( data=all_states, aes(x=long, y=lat, group = group),colour="grey",     fill=NA )

p<-p + geom_point( data=coordinates, aes(x=long, y=lat,color=number.of.tweets
                                     )) + scale_size(name="# of tweets")
p
}
# Example
searchTwitter("dolphin",15,"10mi")

example map

我遇到了一些我不确定如何处理的大问题。首先,如所写的,代码搜索15个不同的随机生成的位置,这些位置是从美国东部的最大经度到最大西部的均匀分布产生的,并且最北部的纬度到最远的南部。这将包括不在美国的地点,例如加拿大明尼苏达州森林湖的东边。我想要一个随机检查以查看生成的位置是否在美国的功能,如果不是,则丢弃它。更重要的是,我想搜索数以千计的地点,但是Twitter不喜欢这样,并给了我一个420 error enhance your calm。所以也许最好每隔几个小时搜索一次,慢慢建立一个数据库并删除重复的推文。最后,如果选择一个远程热门话题,R会给出Error in function (type, msg, asError = TRUE) : transfer closed with 43756 bytes remaining to read之类的错误。我对如何解决这个问题感到有点困惑。

答案 2 :(得分:2)

这是一个玩具示例,假设您每次调用只能提取100条推文:

require(twitteR)
require(plyr)
URL = paste('http://search.twitter.com/search.atom? 
      q=','&geocode=39.724089,-104.820557,3mi','&rpp=100&page=', page, sep='') #Aurora,CO with radii of 3mi
XML = htmlTreeParse(URL, useInternal=TRUE)
entry = getNodeSet(XML, "//entry")
tweets = c()

for (i in 1:99){ 
    t = unlist(xpathApply(entry[[i]], "//title", xmlValue))
    tweets = c(tweets,t)
}

这个解决方案可能不太优雅,但我能够得到特定地理编码的推文。