直接从R中的url读取gzipped csv

时间:2012-03-03 18:19:47

标签: r gzip

我正在寻找下载一个gzip压缩包并将其作为R对象加载而不先将其保存到磁盘。我可以使用压缩文件执行此操作,但似乎无法使用gzfilegzcon

示例:

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

下载一个包含Wikipedia article feedback data的(小)gz压缩文件(不重要,但只是为了表明它不是巨大的或邪恶的)。

我的代码工作正常,但我觉得通过创建和销毁临时文件,我错过了一些非常明显的东西。

3 个答案:

答案 0 :(得分:17)

我几乎可以肯定我之前曾回答过这个问题。结果是R的连接 API(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想要在数据中来回移动(以确认列宽,我猜)。

答案 1 :(得分:1)

此功能概括了Dirk的答案:

R <- function(file_url) {
  con <- gzcon(url(file_url))
  txt <- readLines(con)
  return(read.csv(textConnection(txt)))
}

答案 2 :(得分:1)

使用 data.table :: fread

x <- data.table::fread("http://dumps.wikimedia.org/other/articlefeedback/aa_combined-20110321.csv.gz")

dim(x)
[1] 1490   19

x[, 1:2]
#       aa_page_id page_namespace
#    1:   26224556              0
#    2:      31653              0
#    3:   26224556              0
#    4:   26224556              0
#    5:    1058990              0
#   ---                          
# 1486:     619464              0
# 1487:   19283361              0
# 1488:   19006979              0
# 1489:    5078775              0
# 1490:   30209619              0