Загрузка и открытие xlsx-файла изнутри R - PullRequest
0 голосов
/ 25 января 2019

Я бы хотел скачать и открыть следующий Excel-файл с месячными и годовыми индексами потребительских цен непосредственно из R.

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)

Раньше я загружал этот файл вручную, используя браузер, сохранял его локально на моем компьютере, затем открывал xlsx-файл с R и работал с данными без проблем.

IТеперь я попытался прочитать файл непосредственно из 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)

с последней строкой, возвращающейся как результатt:

 Error: ZipException (Java): invalid entry size (expected 1644 but got 1668 bytes)

Я был бы очень признателен за любую помощь в том, как я могу открыть эти данные и работать с ними, как обычно, при чтении данных из Excel в R. Заранее большое спасибо!

1 Ответ

0 голосов
/ 30 января 2019

Вот мое решение благодаря подсказке @Johnny.Чтение данных из Excel работало лучше с read.xlsx из xlsx-пакета (вместо read_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)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...