我想直接从R中下载并打开以下包含月度和年度消费者价格指数的Excel文件。
https://www.bfs.admin.ch/bfsstatic/dam/assets/7066959/master (链接可以在此网站上找到:https://www.bfs.admin.ch/bfs/de/home/statistiken/preise/landesindex-konsumentenpreise/lik-resultate.assetdetail.7066959.html)
我曾经使用浏览器手动下载此文件,将其保存在本地计算机上,然后使用R打开xlsx文件并使用数据而没有任何问题。
我现在试图直接从R内部读取文件,但到目前为止还算不上运气。从上面的URL中可以看到,没有.xlsx扩展名或类似的文件,因此我发现文件已以某种方式压缩。到目前为止,这是我尝试过的事情,也是我所困的地方。
library(foreign)
library(xlsx)
# in a browser, this links opens or dowloads an xlsx file
likurl <- "https://www.bfs.admin.ch/bfsstatic/dam/assets/7066959/master"
temp <- tempfile()
download.file(likurl, temp)
list.files <- unzip(temp,list=TRUE)
data <- read.xlsx(unz(temp,
+ list.files$Name[8]), sheetIndex=2)
最后一步的结果是
Error in +list.files$Name[8] : invalid argument to unary operator
我不太了解unz函数,但是在阅读unz帮助文件时会发现这是错误的(我在网上某处找到了建议的解决方案)。
我还尝试了以下不同方法:
library(XLConnect)
likurl <- "https://www.bfs.admin.ch/bfsstatic/dam/assets/7066959/master"
tmp = tempfile(fileext = ".xlsx")
download.file(likurl, tmp)
readWorksheetFromFile(tmp, sheet = 2, startRow = 4,
colNames = TRUE, rowNames = FALSE)
最后一行返回结果:
Error: ZipException (Java): invalid entry size (expected 1644 but got 1668 bytes)
当我将数据从excel读取到R中时,我将如何打开这些数据并像往常一样使用它,我将不胜感激。 提前非常感谢!
答案 0 :(得分:1)
这是@Johnny的提示,这是我的解决方案。从xlsx软件包中读取read.xlsx可以更好地从excel读取数据(而不是上面链接中建议的read_excel)。
仍然存在一些丑陋的细节,包括如何命名列(除了第一列和第11列之外,colNames均未正确传递)以及如何通过传递给read.xlsx的选项创建新列(例如,列)名为colNames的所有条目== TRUE;有关详细信息,请参见带有str(LIK.m)的输出结构。但是,这将是另一个问题,目前,可以通过快速而肮脏的方式来解决它们:-)。
library(httr)
library(foreign)
library(xlsx)
# in a browser, this links opens or dowloads an xlsx file
likurl<-'https://www.bfs.admin.ch/bfsstatic/dam/assets/7066959/master'
p1f <- tempfile()
download.file(likurl, p1f, mode="wb")
GET(likurl, write_disk(tf <- tempfile(fileext = ".xlsx")))
# annual CPI
LIK.y <- read.xlsx(tf,
sheetIndex = 2, startRow = 4,
colNames = TRUE, rowNames = FALSE, stringsAsFactors = FALSE,
detectDates = FALSE, skipEmptyRows = TRUE, skipEmptyCols = TRUE ,
na.strings = "NA", check.names = TRUE, fillMergedCells = FALSE)
LIK.y$X. <- as.numeric(LIK.y$X.)
str(LIK.y)
# monthly CPI
LIK.m <- read.xlsx(tf,
sheetIndex = 1, startRow = 4,
colNames = TRUE, rowNames = FALSE, stringsAsFactors = FALSE,
detectDates = FALSE, skipEmptyRows = TRUE, skipEmptyCols = TRUE ,
na.strings = "NA", check.names = TRUE, fillMergedCells = FALSE)
LIK.m$X. <- as.numeric(LIK.m$X.)
str(LIK.m)