r - 从 R 中下载和打开 xlsx 文件的问题
问题描述
我想直接从 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 时,我将非常感谢有关如何打开这些数据并像往常一样使用它的任何帮助。提前非常感谢!
解决方案
感谢@Johnny 的提示,这是我的解决方案。使用 xlsx 包中的 read.xlsx(而不是上面链接中建议的 read_excel)从 excel 中读取数据效果更好。
一些丑陋的细节仍然存在于列的命名方式(colNames 没有正确传递,除了第一列和第 11 列)以及从传递给 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)
推荐阅读
- spartacus-storefront - 如何在 spartcus 中从第三方 cms 而不是 SAP Commerce Cloud 获取内容页面?
- node.js - 将指标从具有多个 docker 容器的多个 VM 推送到 Grafana Cloud
- windows - Windows 过滤平台驱动程序:IPPACKET_V4/V6 标注无法捕获特定机器上的 TCP 数据包
- sql - 具有多列记录的 PL/SQL 成员
- java - keytool 是否仍然需要从 Let's Encrypt pem 文件中由 OpenSSL 创建的 PKCS12 密钥库创建 PKCS12 密钥库?
- lua - 有没有办法听任何按键和静音麦克风?
- dns - 在不更改域名服务器的情况下测试 CloudFlare
- swift - 如何在 SwiftUI 中停止当前状态下的动画
- android - 加载对话框不会透明
- r - 在ggplot中制作多直方图,不识别分组