在R中发出下载和打开xlsx文件的问题

时间:2019-01-25 11:18:45

标签: r excel download

我想直接从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中时,我将如何打开这些数据并像往常一样使用它,我将不胜感激。 提前非常感谢!

1 个答案:

答案 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)