我试图弄清楚如何阅读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
]);
我已经安装了多个软件包,例如RCurl
,XML
和data.table
,并按照相关问题的示例(即使用fread
,readHTMLTable
和getURL
)但我面临着从源代码中读取正确数据的不同问题。太多的噪音我无法过滤掉。例如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的
答案 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()