2010-06-16 36 views
10

Tôi đang làm việc để lưu kết quả tìm kiếm trên twitter vào cơ sở dữ liệu (SQL Server) và tôi gặp lỗi khi tôi lấy kết quả tìm kiếm từ twitteR.Làm thế nào để chuyển đổi kết quả searchTwitter (từ thư viện (twitteR)) thành một data.frame?

Nếu tôi thực hiện:

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

tôi nhận được một lỗi:

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

này rất quan trọng bởi vì để sử dụng RODBC để thêm video này vào một bảng sử dụng sqlSave nó cần phải được một khung dữ liệu. Ít nhất đó là thông báo lỗi tôi nhận được:

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

Vì vậy, có ai có bất kỳ đề xuất nào về cách ép buộc danh sách vào một data.frame hoặc cách tôi có thể tải danh sách thông qua RODBC không?

Mục tiêu cuối cùng của tôi là có một bảng phản ánh cấu trúc của các giá trị được trả về bởi searchTwitter. Dưới đây là một ví dụ về những gì tôi đang cố gắng để lấy và tải:

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" 

Vì vậy, tôi nghĩ rằng data.frame của con chó con nên có tên cột như:

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

Trả lời

3

Hãy thử điều này:

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

twitteR trả về lớp S4, vì vậy bạn cần phải sử dụng một trong các hàm trợ giúp của nó hoặc xử lý trực tiếp với các vị trí của nó. Bạn có thể thấy các khe bằng cách sử dụng unclass(), ví dụ:

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

Những khe có thể được truy cập trực tiếp như tôi làm trên bằng cách sử dụng các chức năng liên quan (từ sự giúp đỡ 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 

Như tôi đã đề cập, đó là sự hiểu biết của tôi rằng bạn sẽ phải tự mình chỉ định từng trường này trong đầu ra. Dưới đây là ví dụ sử dụng hai trường:

> 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 

Bạn có thể biến tính năng này thành chức năng nếu bạn định thực hiện thường xuyên.

+0

Shane, những gì thư viện để tôi cần để nạp cho điều đó? Nó là plyr? – analyticsPierce

+0

Tôi thấy rằng nó là plyr. Nó đã chuyển đổi danh sách thành một data.frame. Bây giờ 10 cột được trả về từ searchTwitter nằm trong một cột duy nhất trong data.frame. Làm thế nào tôi có thể chia chúng ra? – analyticsPierce

+0

Bạn có thể cập nhật câu hỏi của mình không? Tôi không chắc bạn muốn kết quả cuối cùng trông như thế nào ... – Shane

17

tôi sử dụng mã này tôi thấy từ http://blog.ouseful.info/2011/11/09/getting-started-with-twitter-analysis-in-r/ một thời gian trước:

#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

Xin chào, giải pháp này hoạt động! Cảm ơn . – akunyer

+0

OP Tôi đề nghị làm cho giải pháp này được chấp nhận –

1

Đối với những người chạy vào cùng một vấn đề tôi đã được nhận được một lỗi nói

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

Tôi chỉ đơn giản là thay đổi văn bản từ trong

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

tới statusText, như vậy:

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

Chỉ cần một trận giao hữu heads-up: P

6

Tôi biết đây là một câu hỏi cũ, nhưng vẫn còn, đây là những gì tôi nghĩ là một `` hiện đại 'phiên bản' để giải quyết này. Chỉ cần sử dụng chức năng twListToDf

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

Hy vọng nó giúp

+1

Dường như với tôi rằng giải pháp này chỉ hoạt động nếu bạn tìm kiếm và làm việc với các mẩu tin của một người dùng cụ thể? – Simone

+0

Vâng, đây không thực sự là giải pháp ... ít nhất là không phải vấn đề này hoặc trường hợp sử dụng chung của twitteR –

+1

Tôi không đồng ý. Vấn đề cơ bản là làm thế nào để lấy một data.frame từ một đối tượng trạng thái từ twitteR. Nếu bạn có một danh sách của nó, đó là trường hợp của câu hỏi ban đầu, sau đó bạn chỉ cần áp dụng các chức năng cho từng đối tượng trong danh sách. HTH – gvegayon

0

Đây là một chức năng tốt đẹp để chuyển đổi nó thành một DF.

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

Sử dụng nó như:

tweets <- TweetFrame(" ", n) 
Các vấn đề liên quan