如何在R中导入Google Chart的数据表?

时间:2015-05-19 10:58:55

标签: r

我试图弄清楚如何阅读R中谷歌图表的数据表。

例如,this page的源代码包含历史Peercoin每日价格。我想在R矩阵中复制从第497行开始的数据表的内容:

var data = google.visualization.arrayToDataTable([
        ['Period', right_title_name],
        ['2014/10/01 18:00',  0.01189974],
        ['2014/10/02 18:00',  0.01194000],
        ['2014/10/03 18:00',  0.01171897],
        ['2014/10/04 18:00',  0.01199999],
        ['2014/10/05 18:00',  0.01200000],
        ['2014/10/06 18:00',  0.01188685],
        ['2014/10/07 18:00',  0.01161999],

        // data here

        ]);

我已经安装了多个软件包,例如RCurlXMLdata.table,并按照相关问题的示例(即使用freadreadHTMLTablegetURL)但我面临着从源代码中读取正确数据的不同问题。太多的噪音我无法过滤掉。例如RCurl

library(RCurl)
address <- "http://alt19.com/19R/chart_showing_btc.php?shw=1&label=LTC_BTC&source=cryptsy&period=1day"
data <- getURL(address)

data包含所有数据,但我无法使用strsplit(data, "some code here")选择日期和价格。

可能有人建议我实现这个目标吗?

谢谢你, Florent的

2 个答案:

答案 0 :(得分:1)

可能有更好的方法,但是在使用getURL获取页面源之后我通常做的就是使用一些字符串操作。 我的尝试:

pageSource <- getURL(address)    
index1<-str_locate(pageSource,"'Period', right_title_name],")[[2]]
sourceCut1<-substr(pageSource,index1+1,nchar(pageSource))
index2<-str_locate(sourceCut1,"]);")[[1]]
sourceCut2<-substr(sourceCut1,1,index2-1)
#sourceCut2 is the part of page source with the data
data<-str_trim(strsplit(sourceCut2,"\n")[[1]]) #split data rows
dates<-gsub("^.*'([0-9/: ]+).*$", "\\1", data) #extract dates
dates<-as.POSIXct(dates,format="%Y/%m/%d %H:%M")
values<-as.numeric(gsub("^.*,([0-9 .]+).*$", "\\1", data)) #extract numeric values
mydata<-data.frame(dates=dates,values=values)

请注意,只有在数据结构(日期格式,空格,方括号)保持不变的情况下它才会继续工作,否则您可能需要修改一些正则表达式。

答案 1 :(得分:0)

这个答案非常适合您的情况(以及该URL),但它可能足以成为其他有类似挑战的人的基础。您可以使用V8包来解析&amp;解释javascript,所以我抓取页面,提取表的javascript,做一些清理,以便可以很容易地解释然后后处理转换。它并不漂亮,其他人可能能够优化它,但它可以满足您的需求:

library(V8)
library(httr)
library(stringr)
library(dplyr)
library(magrittr)

pg <- GET("http://alt19.com/19R/chart_showing_btc.php?shw=1&label=LTC_BTC&source=cryptsy&period=1day")

content(pg, as="text") %>% 
  str_extract("(google\\.visualization\\.arrayToDataTable.*\\]\\);)") %>% 
  str_replace("google\\.visualization\\.arrayToDataTable\\(", "[") %>% 
  str_replace("\\)", "]") %>% 
  str_replace("right_title_name", "'right_title_name'") -> tbl

ct <- new_context()
ct$eval(tbl) %>% 
  str_split(",") %>% 
  extract2(1) %>% 
  matrix(ncol=2, byrow=TRUE) %>% 
  data.frame(stringsAsFactors=FALSE) %>% 
  tail(-1) %>% 
  select(timestamp=1, value=2) %>% 
  mutate(timestamp=as.Date(as.POSIXct(timestamp)),
         value=as.numeric(value)) -> dat

glimpse(dat)

## Observations: 227
## Variables:
## $ timestamp (date) 2014-10-01, 2014-10-02, 2014-10-03, 2014-1...
## $ value     (dbl) 0.01189974, 0.01194000, 0.01171897, 0.01199...

library(ggplot2)
ggplot(dat, aes(timestamp, value)) + geom_line(size=0.5) + theme_bw()

enter image description here