Как преобразовать результаты поиска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 "&lt;a href=&quot;http://twitterfeed.com&quot; rel=&quot;nofollow&quot;&gt;twitterfeed&lt;/a&gt;"
  .. [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 "&lt;a href=&quot;http://blackberry.com/twitter&quot; rel=&quot;nofollow&quot;&gt;Twitter for BlackBerry®&lt;/a&gt;"
  .. [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&amp;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

Вы можете превратить это в функцию, если вы намереваетесь делать это часто.

Ответ 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)