Come convertire i risultati di searchTwitter (dalla libreria (twitteR)) in un data.frame?

StackOverflow https://stackoverflow.com/questions/3056146

  •  27-09-2019
  •  | 
  •  

Domanda

Sto lavorando per salvare i risultati della ricerca di Twitter in un database (SQL Server) e ricevo un errore quando estraggo i risultati della ricerca da twitteR.

Se eseguo:

library(twitteR)
puppy <- as.data.frame(searchTwitter("puppy", session=getCurlHandle(),num=100))

Ottengo un errore di:

Error in as.data.frame.default(x[[i]], optional = TRUE) : 
  cannot coerce class structure("status", package = "twitteR") into a data.frame

Questo è importante perché per poter utilizzare RODBC per aggiungerlo a una tabella utilizzando sqlSave è necessario che sia un data.frame.Almeno questo è il messaggio di errore che ho ricevuto:

Error in sqlSave(localSQLServer, puppy, tablename = "puppy_staging",  : 
  should be a data frame

Quindi qualcuno ha qualche suggerimento su come forzare l'elenco in un data.frame o su come posso caricare l'elenco tramite RODBC?

Il mio obiettivo finale è avere una tabella che rispecchi la struttura dei valori restituiti da searchTwitter.Ecco un esempio di ciò che sto cercando di recuperare e caricare:

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"

Quindi penso che data.frame di cucciolo dovrebbe avere nomi di colonna come:

- text
- favorited
- replytoSN
- created
- truncated
- replytoSID
- id
- replytoUID
- statusSource
- screenName
È stato utile?

Soluzione

Prova questo:

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

Twitter restituisce una classe S4, quindi è necessario utilizzare una delle sue funzioni di supporto, o trattare direttamente con i suoi slot. È possibile visualizzare gli slot utilizzando unclass(), per esempio:

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

Questi slot è accessibile direttamente come faccio io in precedenza utilizzando le relative funzioni (dal aiuto 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

Come ho già detto, è la mia comprensione che si dovrà specificare ognuno di questi campi se stessi in uscita. Ecco un esempio utilizzando due dei campi:

> 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

Si potrebbe trasformare questo in una funzione, se si ha intenzione di farlo frequentemente.

Altri suggerimenti

Io uso questo codice che ho trovato da http: / /blog.ouseful.info/2011/11/09/getting-started-with-twitter-analysis-in-r/ qualche tempo fa:

#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")

So che questa è una vecchia domanda, ma ecco quella che penso sia una versione "moderna" per risolverlo.Basta usare la funzione twListToDf

gvegayon <- getUser("gvegayon")
timeline <- userTimeline(gvegayon,n=400)
tl <- twListToDF(timeline)

Spero che sia d'aiuto

Per quelli che funzionano nello stesso problema che ho fatto, che stava ottenendo un errore che dice

Error in as.double(y) : cannot coerce type 'S4' to vector of type 'double' 

Ho semplicemente cambiato il testo parola in

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

per statusText, in questo modo:

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

Solo un heads-up amichevoli: P

Ecco una bella funzione per convertirlo in un DF.

TweetFrame<-function(searchTerm, maxTweets)
{
  tweetList<-searchTwitter(searchTerm,n=maxTweets)
  return(do.call("rbind",lapply(tweetList,as.data.frame)))
}

Usa come:

tweets <- TweetFrame(" ", n)

Il pacchetto twitteR ora include una funzione twListToDF che farà questo per voi.

puppy_table <- twListToDF(puppy)
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top