Подтвердить что ты не робот

Чтение gzipped csv непосредственно с URL-адреса в R

Я ищу для загрузки gsipped csv и загружать его как объект R, не сохраняя его сначала на диск. Я могу сделать это с помощью zipped файлов, но не могу заставить его работать с gzfile или gzcon.

Пример:

grabRemote <- function() {
        temp <- tempfile()
        download.file("http://dumps.wikimedia.org/other/articlefeedback/aa_combined-20110321.csv.gz", temp)
        aap.file <- read.csv(gzfile(temp), as.is = TRUE)
        unlink(temp)
        return(aap.file)
    }

Это загружает (небольшой) сжатый файл gz, содержащий данные обратной связи статьи в Википедии (не важно, а просто для того, чтобы указать, что он не является гигантским или гнусным).

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

4b9b3361

Ответ 1

Я почти уверен, что однажды ответил на этот вопрос. Результатом является то, что Подключения API R (file(), url(), pipe(),...) может выполнять декомпрессию "на лету", я не думаю, что вы можете сделать это для удаленного http объекты.

Итак, сделайте сам двухэтапный шаг: используйте download.file() с результатом tempfile() в качестве второго аргумента для извлечения сжатого файла, а затем прочитайте его. Как объект tempfile(), он будет автоматически очищаться в конце вашего сеанса R, поэтому одно незначительное исправление, которое я могу предложить, это пропустить unlink() (но тогда мне нравятся явные очистки, поэтому вы также можете его сохранить).

Изменить: Получено:

con <- gzcon(url(paste("http://dumps.wikimedia.org/other/articlefeedback/",
                       "aa_combined-20110321.csv.gz", sep="")))
txt <- readLines(con)
dat <- read.csv(textConnection(txt))

dim(dat)
# [1] 1490   19

summary(dat[,1:3])
# aa_page_id       page_namespace                 page_title  
# Min.   :     324   Min.   :0      United_States        :  79  
# 1st Qu.:   88568   1st Qu.:0      2011_NBA_Playoffs    :  52  
# Median : 2445733   Median :0      IPad_2               :  43  
# Mean   : 8279600   Mean   :0      IPod_Touch           :  38  
# 3rd Qu.:16179920   3rd Qu.:0      True_Grit_(2010_film):  38  
# Max.   :31230028   Max.   :0      IPhone_4             :  26  
# (Other)              :1214  

Ключ был подсказкой gzcon справки о том, что он может поместить декомпрессию вокруг существующего потока. Затем нам нужен небольшой обход readLines и чтение с помощью textConnection, поскольку read.csv хочет идти туда и обратно в данных (для проверки ширины столбца, я полагаю).