机油公告每周燃油数据:导入R 背景
欧盟委员会收集并公布欧洲汽车燃料的每周平均价格。然而,他们以一种令人痛苦的方式发布它。按此键可以下载.xls格式的数据并查看 我给委员会发了一封电子邮件,询问他们是否可以以类似的结构发布这些数据,但他们回答说他们无意这样做 问题: 是否有人成功编程将此类数据导入R或在将其导入R之前在VBA中进行整理,例如,第一个选项卡:“每CTR的价格和税费” 我试过的 我通常在Excel中手动将国家表一个接一个地堆叠起来,并进行一些其他转换,将更整洁的数据保存为say.csv,然后将其导入R 先谢谢你 编辑 请注意,数据是按国家提供的机油公告每周燃油数据:导入R 背景,r,excel,vba,R,Excel,Vba,欧盟委员会收集并公布欧洲汽车燃料的每周平均价格。然而,他们以一种令人痛苦的方式发布它。按此键可以下载.xls格式的数据并查看 我给委员会发了一封电子邮件,询问他们是否可以以类似的结构发布这些数据,但他们回答说他们无意这样做 问题: 是否有人成功编程将此类数据导入R或在将其导入R之前在VBA中进行整理,例如,第一个选项卡:“每CTR的价格和税费” 我试过的 我通常在Excel中手动将国家表一个接一个地堆叠起来,并进行一些其他转换,将更整洁的数据保存为say.csv,然后将其导入R 先谢谢你 编辑
url = "http://ec.europa.eu/energy/observatory/reports/Oil_Bulletin_Prices_History.xls"
download.file(url=url, "data/PriceHistory.xls")
require(XLConnect)
wb <- XLConnect::loadWorkbook("data/PriceHistory.xls")
dt <- readWorksheet(wb, sheet = 1, startRow = 1, endRow = 14992)
dt.body <- dt[7:14992, 2:7]
dt.head <- c("Date", "ExcRate", "EuroSuper", "GasOilAuto", "GasOilHeat", "FuelOil")
colnames(dt.body) <- dt.head
dt.body <- dt.body[nchar(dt.body$Date) == nchar(dt.body$Date[1]), ]
dt.body[["Date"]] <- as.Date(dt.body[["Date"]], format = "%Y-%m-%d %H:%M:%S")
for(i in 2:ncol(dt.body)) {
dt.body[, i] <- as.numeric(dt.body[, i])
}
结果是(在na.之后省略)
会话信息:
您可以使用Malaya的代码(如有必要,请更改下载目的地)
然后添加此项以使导入的数据整洁:
library(dplyr)
library(tidyr)
dt.body.tidy <- dt.body %>%
gather(fueltype, price, 3:ncol(dt.body), -ExcRate)
dt.body.tidy <- dt.body.tidy %>%
filter(ExcRate == 1)
library(ggplot2)
dt.body.tidy %>%
ggplot(aes(Date, price)) +
geom_line(color="darkgrey") +
geom_line(stat="summary", fun.y="median", color="red", size=0.3)+
facet_wrap(~fueltype, ncol=1)
库(dplyr)
图书馆(tidyr)
dt.body.tidy%
聚集(燃料类型,价格,3:ncol(dt.body),-ExcRate)
dt.body.tidy%
过滤器(ExcRate==1)
图书馆(GG2)
dt.body.tidy%>%
ggplot(aes(日期、价格))+
几何线(color=“darkgrey”)+
几何线(stat=“summary”,fun.y=“median”,color=“red”,size=0.3)+
面_包裹(~fueltype,ncol=1)
另外,这只导入第一个工作表,并且硬编码了startrow和endrow的值,但是您可以根据需要调整代码
在我自己的答案之前发布的答案是部分解决方案。我决定发表我的文章,这在一定程度上受到了他们的影响
下载文件
假设
遵循
可以打开Excel文件并将选项卡保存为单独的.csv文件,以say\t
分隔。假设其中三个保存在工作目录中(“Prices wo taxes,per CTR”,“Prices with taxes,per CTR”,“All taxes,per CTR”),并将它们命名为mpc_ex_taxes.txt
,mpc.txt
,taxes.txt
,下面的代码应该可以工作
使用的图书馆
从.csv文件获取数据
会话信息
您需要哪些选项卡?每个选项卡上都有不同的数据。。以下是我将如何开始:使用readxl包。阅读选项卡名称并筛选不需要的选项卡。例如,去掉图表。然后基本上做sg。与此类似:如我所写的列出表格…说“每CTR的价格和税费”抱歉,刚刚意识到第一组下有数据。我应该读得更仔细一些。谢谢你的回答和努力。它在我的机器上还不能工作…我有一些错误。您是否也可以粘贴您的sessionInfo()
?此外,表中没有国家代码。我在答案中添加了sessionInfo,但您得到的错误是什么?我在Windows操作系统机器上,使用您的解决方案会出现以下错误:error:IOException(Java):您的文件包含20919个扇区,但索引20处的初始DIFAT数组引用了块#658688。这是不允许的,而且您的文件已损坏
我不知道,这似乎是一些与Java相关的问题。我不确定是什么错误,可能是XLConnect
的问题,您可以使用gdata
或其他软件包将excel文件放入R。除了我得到的错误,还有一件事。您的解决方案缺少国家/地区代码,因为数据是按国家/地区发布的。不管怎样,我都会投票支持你的答案,但目前这只是一个部分解决方案。谢谢你的努力,但是在我的Windows机器上,TheRimalaya提供的代码仍然不起作用。
Source: local data table [11,054 x 6]
Date ExcRate EuroSuper GasOilAuto GasOilHeat FuelOil
(date) (dbl) (dbl) (dbl) (dbl) (dbl)
1 2016-03-07 1 371.64 387.86 358.08 176
2 2016-02-29 1 370.81 382.03 344.54 171
3 2016-02-22 1 375.81 384.53 339.44 171
4 2016-02-15 1 369.97 372.03 331.05 171
5 2016-02-08 1 382.47 380.36 337.09 178
6 2016-02-01 1 387.47 376.19 337.01 172
7 2016-01-25 1 384.97 370.36 321.67 146
8 2016-01-18 1 392.47 385.36 329.30 165
9 2016-01-11 1 413.31 407.86 346.26 175
10 2016-01-04 1 418.31 412.86 363.64 176
.. ... ... ... ... ... ...
R version 3.2.4 (2016-03-10)
Platform: x86_64-apple-darwin13.4.0 (64-bit)
Running under: OS X 10.11.3 (El Capitan)
locale:
[1] en_US.UTF-8/en_US.UTF-8/en_US.UTF-8/C/en_US.UTF-8/en_US.UTF-8
attached base packages:
[1] stats graphics grDevices utils datasets methods base
other attached packages:
[1] MASS_7.3-45 ggplot2_2.0.0 dplyr_0.4.3 data.table_1.9.7
loaded via a namespace (and not attached):
[1] Rcpp_0.12.3 digest_0.6.9 assertthat_0.1 chron_2.3-47
[5] grid_3.2.4 R6_2.1.2 plyr_1.8.3 gtable_0.1.2
[9] DBI_0.3.1 magrittr_1.5 scales_0.3.0 pls_2.5-0
[13] labeling_0.3 tools_3.2.4 munsell_0.4.3 parallel_3.2.4
[17] colorspace_1.2-6
library(dplyr)
library(tidyr)
dt.body.tidy <- dt.body %>%
gather(fueltype, price, 3:ncol(dt.body), -ExcRate)
dt.body.tidy <- dt.body.tidy %>%
filter(ExcRate == 1)
library(ggplot2)
dt.body.tidy %>%
ggplot(aes(Date, price)) +
geom_line(color="darkgrey") +
geom_line(stat="summary", fun.y="median", color="red", size=0.3)+
facet_wrap(~fueltype, ncol=1)
url = "http://ec.europa.eu/energy/observatory/reports/Oil_Bulletin_Prices_History.xls"
download.file(url = url, "PriceHistory.xls")
library(plyr)
library(dplyr)
library(readr)
library(stringr)
library(lubridate)
library(ggplot2)
library(tidyr)
# name of .txt files
my_file_name <-
c("mpc_ex_taxes", "mpc", "taxes")
# c("mpc")
my_files <-
str_c(my_file_name, ".txt")
# getting data at once
my_file_list <- list()
for(file in seq_along(my_files)){
# read data: line by line (assuming you are in working directory)
# my_oil <- read_lines(my_files[1])
my_oil <- read_lines(my_files[file])
# split by delimiter
my_oil_split <- str_split(my_oil, "\t")
# compute length of vector in each line
my_len <- sapply(my_oil_split, length)
# filter lines with vector length equal to 9
my_data <-
my_oil_split[which(my_len == 9)] %>%
ldply(.) %>%
tbl_df
# offset rows by this integer (used below in selecting data values)
my_number_to_add <- 4
# get country codes; str_length(V1) == 2
# get index_of_data; my_number_to_add lower than country code
my_geos <-
my_data %>%
select(V1) %>%
add_rownames(., var = "index_geo") %>%
filter(str_length(V1) == 2) %>%
mutate(index_geo = as.numeric(index_geo),
index_of_data = index_geo + my_number_to_add) %>%
rename(geo = V1)
# calculate index where data for each country starts and where data ends
my_data_values <-
my_data %>%
add_rownames(., var = "index_of_data") %>%
filter(str_length(V2) == 8) %>%
mutate(index_of_data = as.integer(index_of_data),
diff_index_of_data = index_of_data - lag(index_of_data, 1),
index_of_data_end = index_of_data - diff_index_of_data) %>%
filter(is.na(diff_index_of_data) | diff_index_of_data > 1) %>%
mutate(index_of_data_end = lead(index_of_data_end, 1)) %>%
select(matches("^index"))
# join country codes and start and end of data values
my_case <-
left_join(my_geos, my_data_values) %>%
filter(complete.cases(.))
# get data for each country except the last one (UK)
my_data_list <- list()
for(i in seq_along(my_case$geo)){
my_data_list[[i]] <-
my_data[my_case$index_of_data[i]:my_case$index_of_data_end[i], ]
}
names(my_data_list) <- my_case$geo
# tidy dataset
my_df <-
ldply(my_data_list) %>%
tbl_df %>%
rename(geo = .id) %>%
select(geo, V2:V7) %>%
mutate(my_date = as.Date(dmy(V2))) %>%
select(-V2) %>%
mutate_each(funs(str_replace_all(., ",", ""))) %>%
mutate_each(funs(as.numeric), matches("V")) %>%
select(geo, my_date, everything())
# renaming the variables
my_names <- c("my_geo", "my_date", "ExcRate", "Gasoline",
"Diesel", "GasOilHeat", "FuelOil")
names(my_df) <- my_names
my_df_to_save <-
my_df %>%
mutate(my_fuel_price_component = rep(my_file_name[file]))
my_file_list[[file]] <- my_df_to_save
}
# final data frame
my_final_fuel_df <-
my_file_list %>%
ldply(.) %>%
tbl_df
Source: local data frame [42,495 x 8]
my_geo my_date ExcRate Gasoline Diesel GasOilHeat FuelOil my_fuel_price_component
(chr) (chr) (dbl) (dbl) (dbl) (dbl) (dbl) (chr)
1 AT 2016-03-14 1 387.47 409.53 373.71 191 mpc_ex_taxes
2 AT 2016-03-07 1 371.64 387.86 358.08 176 mpc_ex_taxes
3 AT 2016-02-29 1 370.81 382.03 344.54 171 mpc_ex_taxes
4 AT 2016-02-22 1 375.81 384.53 339.44 171 mpc_ex_taxes
5 AT 2016-02-15 1 369.97 372.03 331.05 171 mpc_ex_taxes
6 AT 2016-02-08 1 382.47 380.36 337.09 178 mpc_ex_taxes
7 AT 2016-02-01 1 387.47 376.19 337.01 172 mpc_ex_taxes
8 AT 2016-01-25 1 384.97 370.36 321.67 146 mpc_ex_taxes
9 AT 2016-01-18 1 392.47 385.36 329.30 165 mpc_ex_taxes
10 AT 2016-01-11 1 413.31 407.86 346.26 175 mpc_ex_taxes
.. ... ... ... ... ... ... ... ...
R version 3.2.4 (2016-03-10)
Platform: x86_64-w64-mingw32/x64 (64-bit)
Running under: Windows 7 x64 (build 7601) Service Pack 1
locale:
[1] LC_COLLATE=Slovenian_Slovenia.1250 LC_CTYPE=Slovenian_Slovenia.1250 LC_MONETARY=Slovenian_Slovenia.1250
[4] LC_NUMERIC=C LC_TIME=Slovenian_Slovenia.1250
attached base packages:
[1] stats graphics grDevices utils datasets methods base
other attached packages:
[1] tidyr_0.3.0 ggplot2_1.0.1 lubridate_1.5.0 stringr_1.0.0 readr_0.2.2
[6] dplyr_0.4.3 plyr_1.8.3 XLConnect_0.2-11 XLConnectJars_0.2-9
loaded via a namespace (and not attached):
[1] Rcpp_0.12.0 digest_0.6.8 assertthat_0.1 MASS_7.3-44 grid_3.2.4 R6_2.1.1
[7] gtable_0.1.2 DBI_0.3.1 magrittr_1.5 scales_0.3.0 stringi_0.5-5 lazyeval_0.1.10
[13] reshape2_1.4.1 labeling_0.3 proto_0.3-10 tools_3.2.4 munsell_0.4.2 parallel_3.2.4
[19] colorspace_1.2-6 rJava_0.9-7