Как преобразовать результаты searchTwitter (из библиотеки (Твиттер)) в data.frame?

Я работаю над сохранением результатов поиска Твиттера в базу данных (SQL Server) и получаю ошибку, когда я вытягиваю результаты поиска от Твиттера.

Если я выполняюсь:

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
  .. ..@ 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__
  .. ..@ favorited   : logi FALSE
  .. ..@ replyToSN   : chr(0) 
  .. ..@ created     : chr "Wed, 16 Jun 2010 19:04:03 +0000"
  .. ..@ truncated   : logi FALSE
  .. ..@ replyToSID  : num(0) 
  .. ..@ id          : num 1.63e+10
  .. ..@ replyToUID  : num(0) 
  .. ..@ statusSource: chr "&lt;a href=&quot;http://twitterfeed.com&quot; rel=&quot;nofollow&quot;&gt;twitterfeed&lt;/a&gt;"
  .. ..@ screenName  : chr "puppy_ads"
 $ :Formal class 'status' [package "twitteR"] with 10 slots
  .. ..@ text        : chr "the cutest puppy followed me on my walk, my grandma won't let me keep it. taking it to the pound sadface"
  .. ..@ favorited   : logi FALSE
  .. ..@ replyToSN   : chr(0) 
  .. ..@ created     : chr "Wed, 16 Jun 2010 19:04:01 +0000"
  .. ..@ truncated   : logi FALSE
  .. ..@ replyToSID  : num(0) 
  .. ..@ id          : num 1.63e+10
  .. ..@ replyToUID  : num(0) 
  .. ..@ statusSource: chr "&lt;a href=&quot;http://blackberry.com/twitter&quot; rel=&quot;nofollow&quot;&gt;Twitter for BlackBerry®&lt;/a&gt;"
  .. ..@ screenName  : chr "iamsweaters"

Таким образом, я думаю, что data.frame щенка должен иметь имена столбцов как:

- text
- favorited
- replytoSN
- created
- truncated
- replytoSID
- id
- replytoUID
- statusSource
- screenName
11
задан analyticsPierce 16 June 2010 в 19:08
поделиться

1 ответ

Попробуйте следующее:

ldply(searchTwitter("#rstats", n=100), text)

twitteR возвращает класс S4, поэтому вам нужно либо использовать одну из его вспомогательных функций, либо иметь дело непосредственно с его слотами. Вы можете увидеть слоты, используя unclass () , например:

unclass(searchTwitter("#rstats", n=100)[[1]])

Эти слоты можно получить напрямую, как я сделал выше, с помощью связанных функций (из справки twitteR:? StatusSource):

  text Возвращает текст статуса
избранное Возвращает избранную информацию для статуса
replyToSN Возвращает слот replyToSN для этого статуса.
created Возвращает время создания этого статуса
truncated Возвращает усеченную информацию для этого статуса.
replyToSID Возвращает слот replyToSID для этого статуса.
id Возвращает идентификатор этого статуса
replyToUID Возвращает слот replyToUID для этого статуса.
statusSource Возвращает источник статуса для этого статуса

Как я уже упоминал, насколько я понимаю, вам нужно будет указать каждое из этих полей самостоятельно в выводе. Вот пример использования двух полей:

> 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
ответ дан 3 December 2019 в 03:17
поделиться