2010-06-16 1 views
10

Я работаю над сохранением результатов поиска twitter в базе данных (SQL Server), и я получаю сообщение об ошибке, когда я вытягиваю результаты поиска из twitteR.Как преобразовать результаты поискаTwitter (из библиотеки (twitteR)) в data.frame?

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

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?

Моя конечная цель - иметь таблицу, которая отражает структуру значений, возвращаемых поисковым тегом. Вот пример того, что я пытаюсь получить и нагрузки:

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 

ответ

3

Попробуйте это:

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 

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

+0

Шейн, какую библиотеку мне нужно сделать, чтобы загрузить для этого? Это plyr? – analyticsPierce

+0

Я вижу, что это plyr. Он преобразовал список в data.frame. Теперь 10 столбцов, которые возвращаются из searchTwitter, находятся в одном столбце в файле data.frame. Как я могу разделить их? – analyticsPierce

+0

Можете ли вы обновить свой вопрос? Я не уверен, что вы хотите, чтобы конечный результат выглядел так ... – Shane

17

Я использую этот код, который я нашел из http://blog.ouseful.info/2011/11/09/getting-started-with-twitter-analysis-in-r/ некоторое время назад:

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

Привет, это решение работает! Благодарю . – akunyer

+0

OP Я предлагаю сделать это принятым решением –

1

Для тех, которые работают в одной и той же проблемой я сделал, который получал ошибку говоря

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

6

Я знаю, что это старый вопрос, но все-таки, вот что я думаю, что это `` современный «» версия для решения этой проблемы. Просто используйте функцию twListToDf

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

Надеется, что это помогает

+1

Мне кажется, что это решение работает только при поиске и работе с твитами конкретного пользователя? – Simone

+0

Да, на самом деле это не решение ... по крайней мере, не для этой проблемы или общего варианта использования twitteR –

+1

Я не согласен. Проблема была в основном в том, как получить data.frame из объекта статуса из twitteR. Если у вас есть его список, который относится к исходному вопросу, вы просто применяете функцию к каждому объекту в списке. HTH – gvegayon

0

Вот хорошая функция, чтобы преобразовать его в DF.

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

Используйте его как:

tweets <- TweetFrame(" ", n) 
Смежные вопросы