代码之家  ›  专栏  ›  技术社区  ›  analyticsPierce

如何将searchtwitter结果(从库(twitter))转换为data.frame?

  •  11
  • analyticsPierce  · 技术社区  · 14 年前

    我正在努力将Twitter搜索结果保存到数据库(SQL Server)中,当我从Twitter中提取搜索结果时,会收到一个错误。

    如果我执行:

    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"
    

    因此,我认为puppy的data.frame应该具有以下列名称:

    - text
    - favorited
    - replytoSN
    - created
    - truncated
    - replytoSID
    - id
    - replytoUID
    - statusSource
    - screenName
    
    6 回复  |  直到 6 年前
        1
  •  3
  •   Shane    14 年前

    试试这个:

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

    Twitter返回一个S4类,因此您需要使用它的一个助手函数,或者直接处理它的插槽。您可以使用 unclass() 例如:

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

    通过使用相关的功能(从Twitter帮助:?状态源):

     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
    

    如果你打算经常这样做,你可以把它变成一个函数。

        2
  •  17
  •   ARobertson    13 年前

    我使用我从中找到的代码 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")
    
        3
  •  7
  •   gvegayon    10 年前

    我知道这是一个古老的问题,但我仍然认为这是一个“现代”版本来解决这个问题。只需使用函数 twListToDf

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

    希望它有帮助

        4
  •  1
  •   martin122089    12 年前

    对于那些遇到同样问题的人,我做了一个错误的说法

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

    我只是把文字改了一下

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

    状态文本,如:

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

    只是一个友好的抬头:P

        5
  •  0
  •   Rohit Tikyani    8 年前

    这里有一个很好的函数可以将其转换为df。

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

    使用它作为:

    tweets <- TweetFrame(" ", n)
    
        6
  •  0
  •   Seth    6 年前

    这个 twitteR 包现在包含一个函数 twListToDF 那会帮你的。

    puppy_table <- twListToDF(puppy)