Как читать IMF xls- или sdmx-данные с url-адреса?

Из IMF я хочу читать файл .xls из URL-адреса непосредственно в R, но пока все попытки заканчиваются неудачно. Как ни странно, я могу скачать файл вручную или download.file() и без проблем открыть в Microsoft Outlook или в текстовом редакторе. Однако даже тогда я не могу прочитать данные в R.

Я всегда пробую и https, и http.

myUrl <- "https://www.imf.org/external/pubs/ft/weo/2019/02/weodata/WEOOct2019all.xls"
myUrl2 <- "http://www.imf.org/external/pubs/ft/weo/2019/02/weodata/WEOOct2019all.xls"

1. Классический подход - не получается.

imf <- read.table(file=myUrl, sep="\t", header=TRUE)
# Error in scan(file = file, what = what, sep = sep, quote = quote, dec = dec,  : 
#                 line 51 did not have 55 elements

imf <- read.table(file=url(myUrl), sep="\t", header=TRUE)
# Error in scan(file = file, what = what, sep = sep, quote = quote, dec = dec,  : 
#                 line 51 did not have 55 elements

2. Несколько пакетов - не удается.

imf <- readxl::read_xls(myUrl)
# Error: `path` does not exist: ‘https://www.imf.org/external/pubs/ft/weo/2019/02/weodata/WEOOct2019all.xls’

imf <- readxl::read_xls(myUrl2)
# Error: `path` does not exist: ‘http://www.imf.org/external/pubs/ft/weo/2019/02/weodata/WEOOct2019all.xls’

imf <- gdata::read.xls(myUrl)
# Error in xls2sep(xls, sheet, verbose = verbose, ..., method = method,  : 
#   Intermediate file 'C:\Users\jay\AppData\Local\Temp\RtmpUtW45x\file16f873be18e0.csv' missing!
# In addition: Warning message:
# In system(cmd, intern = !verbose) :
#   running command '"C:\STRAWB~1\perl\bin\perl.exe" 
#   "C:/Program Files/R/R-3.6.1rc/library/gdata/perl/xls2csv.pl" 
#   "https://www.imf.org/external/pubs/ft/weo/2019/02/weodata/WEOOct2019all.xls" 
#   "C:\Users\jay\AppData\Local\Temp\RtmpUtW45x\file16f873be18e0.csv" "1"' had status 2
# Error in file.exists(tfn) : invalid 'file' argument

imf <- gdata::read.xls(myUrl2)  # <----------------------------------------------  THIS DOWNLOADS SOMETHING AT LEAST!
# trying URL 'http://www.imf.org/external/pubs/ft/weo/2019/02/weodata/WEOOct2019all.xls'
# Content type 'application/vnd.ms-excel' length unknown
# downloaded 8.9 MB
#
# Error in xls2sep(xls, sheet, verbose = verbose, ..., method = method,  : 
#   Intermediate file 'C:\Users\jay\AppData\Local\Temp\RtmpUtW45x\file16f87ded406b.csv' missing!
# In addition: Warning message:
# In system(cmd, intern = !verbose) :
#   running command '"C:\STRAWB~1\perl\bin\perl.exe" 
#   "C:/Program Files/R/R-3.6.1rc/library/gdata/perl/xls2csv.pl" 
#   "C:\Users\jay\AppData\Local\Temp\RtmpUtW45x\file16f87f532cb3.xls" 
#   "C:\Users\jay\AppData\Local\Temp\RtmpUtW45x\file16f87ded406b.csv" "1"' had status 255
# Error in file.exists(tfn) : invalid 'file' argument

3. Подход с временным файлом - не работает.

temp <- tempfile()
download.file(myUrl, temp)  # THIS WORKS...

## BUT...
imf <- gdata::read.xls(temp)
# Error in xls2sep(xls, sheet, verbose = verbose, ..., method = method,  : 
#   Intermediate file 'C:\Users\jay\AppData\Local\Temp\RtmpUtW45x\file16f870f55e04.csv' missing!
# In addition: Warning message:
# In system(cmd, intern = !verbose) :
#   running command '"C:\STRAWB~1\perl\bin\perl.exe"
#   "C:/Program Files/R/R-3.6.1rc/library/gdata/perl/xls2csv.pl" 
#   "C:\Users\jay\AppData\Local\Temp\RtmpUtW45x\file16f8746a46db" 
#   "C:\Users\jay\AppData\Local\Temp\RtmpUtW45x\file16f870f55e04.csv" "1"' had status 255
# Error in file.exists(tfn) : invalid 'file' argument

# even not...
tmp1 <- readLines(temp)
# Warning message:
#   In readLines(temp) :
#   incomplete final line found on 
#   'C:\Users\jay\AppData\Local\Temp\Rtmp00GPlq\file2334435c2905'
str(tmp1)
#  chr [1:8733] "WEO Country Code\tISO\tWEO Subject Code\tCountry\tSubject 
#    Descriptor\tSubject Notes\tUnits\tScale\tCountry/Seri"| __truncated__ ...

4. SDMX

Я также пробовал SDMX, предлагаемый МВФ, но тоже безуспешно. Возможно, это был бы более сложный подход, но я никогда не использовал SDMX.

link <- "https://www.imf.org/external/pubs/ft/weo/2019/02/weodata/WEOOct2019_SDMXData.zip"

temp <- tempfile()
download.file(link, temp, quiet=TRUE)
imf <- rsdmx::readSDMX(temp)
# Error in function (type, msg, asError = TRUE)  : 
#   Could not resolve host: C

# imf <- rsdmx::readSDMX(unzip(temp))  # runs forever and crashes R
unlink(temp)

Теперь ... кто-нибудь знает, что происходит и как я могу загрузить данные в R?


person jay.sf    schedule 15.11.2019    source источник


Ответы (1)


Почему бы просто не использовать fill=TRUE?

imf <- read.table(file=myUrl, sep="\t", header=TRUE, fill = TRUE)

с ?read.table

заполнить

логично. Если TRUE, то в случае, если строки имеют неравную длину, неявно добавляются пустые поля. Смотрите подробности'.

person deepseefan    schedule 15.11.2019