Как преобразовать результаты поискаTwitter (из библиотеки (twitteR)) в data.frame?
Я работаю над сохранением результатов поиска twitter в базе данных (SQL Server), и я получаю сообщение об ошибке, когда я вытягиваю результаты поиска из twitteR.
Если я выполняю:
library(twitteR)
puppy <- as.data.frame(searchTwitter("puppy", session=getCurlHandle(),num=100))
Я получаю сообщение об ошибке:
Error in as.data.frame.default(x[[i]], optional = TRUE) :
cannot coerce class structure("status", package = "twitteR") into a data.frame
Это важно, потому что для использования RODBC для добавления этого в таблицу с использованием sqlSave он должен быть data.frame. По крайней мере, я получил сообщение об ошибке:
Error in sqlSave(localSQLServer, puppy, tablename = "puppy_staging", :
should be a data frame
И есть ли у кого-нибудь какие-либо предложения о том, как принуждать список к файлу data.frame или как я могу загрузить список через RODBC?
Моя конечная цель - иметь таблицу, которая отражает структуру значений, возвращаемых searchTwitter. Вот пример того, что я пытаюсь извлечь и загрузить:
library(twitteR)
puppy <- searchTwitter("puppy", session=getCurlHandle(),num=2)
str(puppy)
List of 2
$ :Formal class 'status' [package "twitteR"] with 10 slots
.. [email protected] text : chr "beautifull and kc reg Beagle Mix for rehomes: This little puppy is looking for a new loving family wh... http://bit.ly/9stN7V "| __truncated__
.. [email protected] favorited : logi FALSE
.. [email protected] replyToSN : chr(0)
.. [email protected] created : chr "Wed, 16 Jun 2010 19:04:03 +0000"
.. [email protected] truncated : logi FALSE
.. [email protected] replyToSID : num(0)
.. [email protected] id : num 1.63e+10
.. [email protected] replyToUID : num(0)
.. [email protected] statusSource: chr "<a href="http://twitterfeed.com" rel="nofollow">twitterfeed</a>"
.. [email protected] screenName : chr "puppy_ads"
$ :Formal class 'status' [package "twitteR"] with 10 slots
.. [email protected] text : chr "the cutest puppy followed me on my walk, my grandma won't let me keep it. taking it to the pound sadface"
.. [email protected] favorited : logi FALSE
.. [email protected] replyToSN : chr(0)
.. [email protected] created : chr "Wed, 16 Jun 2010 19:04:01 +0000"
.. [email protected] truncated : logi FALSE
.. [email protected] replyToSID : num(0)
.. [email protected] id : num 1.63e+10
.. [email protected] replyToUID : num(0)
.. [email protected] statusSource: chr "<a href="http://blackberry.com/twitter" rel="nofollow">Twitter for BlackBerry®</a>"
.. [email protected] screenName : chr "iamsweaters"
Итак, я думаю, что data.frame щенка должен иметь имена столбцов, например:
- text
- favorited
- replytoSN
- created
- truncated
- replytoSID
- id
- replytoUID
- statusSource
- screenName
Ответы
Ответ 1
Попробуйте следующее:
ldply(searchTwitter("#rstats", n=100), text)
twitteR возвращает класс S4, поэтому вам нужно либо использовать одну из своих вспомогательных функций, либо напрямую обращаться к своим слотам. Вы можете увидеть слоты, используя unclass()
, например:
unclass(searchTwitter("#rstats", n=100)[[1]])
Эти слоты можно получить непосредственно, как я делаю выше, используя связанные функции (из справки twitteR:? statusSource):
text Returns the text of the status
favorited Returns the favorited information for the status
replyToSN Returns the replyToSN slot for this status
created Retrieves the creation time of this status
truncated Returns the truncated information for this status
replyToSID Returns the replyToSID slot for this status
id Returns the id of this status
replyToUID Returns the replyToUID slot for this status
statusSource Returns the status source for this status
Как я уже говорил, я понимаю, что вам нужно будет указать каждое из этих полей самостоятельно на выходе. Вот пример использования двух полей:
> head(ldply(searchTwitter("#rstats", n=100),
function(x) data.frame(text=text(x), favorited=favorited(x))))
text
1 @statalgo how does that actually work? does it share mem between #rstats and postgresql?
2 @jaredlander Have you looked at PL/R? You can call #rstats from PostgreSQL: http://www.joeconway.com/plr/.
3 @CMastication I was hoping for a cool way to keep data in a DB and run the normal #rstats off that. Maybe a translator from R to SQL code.
4 The distribution of online data usage: AT&T has recently announced it will no longer http://goo.gl/fb/eTywd #rstat
5 @jaredlander not that I know of. Closest is sqldf package which allows #rstats and sqlite to share mem so transferring from DB to df is fast
6 @CMastication Can #rstats run on data in a DB?Not loading it in2 a dataframe or running SQL cmds but treating the DB as if it wr a dataframe
favorited
1 FALSE
2 FALSE
3 FALSE
4 FALSE
5 FALSE
6 FALSE
Вы можете превратить это в функцию, если вы намереваетесь делать это часто.
Ответ 2
Я использую этот код, который я нашел из http://blog.ouseful.info/2011/11/09/getting-started-with-twitter-analysis-in-r/ a назад:
#get data
tws<-searchTwitter('#keyword',n=10)
#make data frame
df <- do.call("rbind", lapply(tws, as.data.frame))
#write to csv file (or your RODBC code)
write.csv(df,file="twitterList.csv")
Ответ 3
Я знаю, что это старый вопрос, но, тем не менее, вот что я считаю "современной" версией для решения этой проблемы. Просто используйте функцию twListToDf
gvegayon <- getUser("gvegayon")
timeline <- userTimeline(gvegayon,n=400)
tl <- twListToDF(timeline)
Надеюсь, что это поможет
Ответ 4
Для тех, кто сталкивается с той же проблемой, я сделал ошибку, говорящую
Error in as.double(y) : cannot coerce type 'S4' to vector of type 'double'
Я просто изменил текст слова в
ldply(searchTwitter("#rstats", n=100), text)
в statusText, например:
ldply(searchTwitter("#rstats", n=100), statusText)
Просто дружеский хедз-ап: P
Ответ 5
Вот хорошая функция, чтобы преобразовать ее в DF.
TweetFrame<-function(searchTerm, maxTweets)
{
tweetList<-searchTwitter(searchTerm,n=maxTweets)
return(do.call("rbind",lapply(tweetList,as.data.frame)))
}
Используйте его как:
tweets <- TweetFrame(" ", n)
Ответ 6
twitteR
пакет twitteR
включает функцию twListToDF
, которая сделает это за вас.
puppy_table <- twListToDF(puppy)