2010-06-16 10 views
10

Pracuję nad zapisywaniem wyników wyszukiwania twitterów w bazie danych (SQL Server) i otrzymuję komunikat o błędzie, gdy wyciągam wyniki wyszukiwania z twitteR.Jak przekonwertować wyniki searchTwitter (z biblioteki (twitteR)) do data.frame?

Gdybym wykonać:

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

otrzymuję błąd:

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

Jest to ważne, ponieważ w celu wykorzystania RODBC aby dodać do tabeli za pomocą sqlSave musi być ramka danych. Przynajmniej to komunikat o błędzie mam:

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

Więc czy ktoś ma jakieś sugestie, w jaki sposób zmusić listę data.frame lub jak mogę załadować listę poprzez RODBC?

Ostatecznym celem jest posiadanie tabeli, która odzwierciedla strukturę wartości zwróconych przez searchTwitter. Oto przykład tego, co staram się odzyskać i obciążenie:

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" 

Więc myślę, że data.frame szczeniaka powinny mieć nazwy kolumn jak:

- text 
- favorited 
- replytoSN 
- created 
- truncated 
- replytoSID 
- id 
- replytoUID 
- statusSource 
- screenName 

Odpowiedz

3

Spróbuj:

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

twitteR zwraca klasę S4, więc musisz użyć jednej z jej funkcji pomocniczych lub bezpośrednio z jej gniazdami. widać szczeliny za pomocą unclass(), na przykład: można uzyskać

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

Szczeliny te bezpośrednio, jak ja powyżej stosując odpowiednie funkcje (z pomocą 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 

Jak już wspomniałem, rozumiem, że będziesz musiał określić każde z tych pól samodzielnie na wyjściu. Oto przykład użycia dwóch pól:

> 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 

Możesz zamienić to w funkcję, jeśli zamierzasz robić to często.

+0

Shane, co biblioteka muszę załadować do tego? Czy to jest plyr? – analyticsPierce

+0

Widzę, że to jest plyr. Przekształciła listę w data.frame. Teraz 10 kolumn, które są zwracane z searchTwitter, znajduje się w pojedynczej kolumnie w data.frame. Jak mogę je rozdzielić? – analyticsPierce

+0

Czy możesz zaktualizować swoje pytanie? Nie jestem pewien, jak chcesz wyglądać końcowy wynik ... – Shane

1

Dla tych, które działają na ten sam problem zrobiłem którą otrzymuję błąd mówiący

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

po prostu zmienił tekst słowo w

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

do statusText, jak w przykładzie:

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

Tylko przyjazny heads-up: P

6

Wiem, że to pytanie jest stary, ale wciąż tu jest to, co myślę, że jest `` nowoczesny „” wersja rozwiązać ten problem. Wystarczy skorzystać z funkcji twListToDf

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

nadzieję, że pomoże

+1

Wydaje mi się, że to rozwiązanie działa tylko w przypadku wyszukiwania i pracy z tweetami konkretnego użytkownika? – Simone

+0

Tak, to naprawdę nie jest rozwiązanie ... przynajmniej nie do tego problemu lub ogólnego przypadku użycia twitteR –

+1

Nie zgadzam się. Problem polegał głównie na tym, w jaki sposób uzyskać obiekt data.frame z obiektu statusu z twitteR. Jeśli masz listę tego, co jest w oryginalnym pytaniu, to po prostu zastosuj funkcję do każdego obiektu na liście. HTH – gvegayon

0

Oto miła funkcja, aby przekształcić go w DF.

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

używać go jako:

tweets <- TweetFrame(" ", n)