我正在寻找下载一个gzip压缩包并将其作为R对象加载而不先将其保存到磁盘。我可以使用压缩文件执行此操作,但似乎无法使用gzfile
或gzcon
。
示例:
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压缩文件(不重要,但只是为了表明它不是巨大的或邪恶的)。
我的代码工作正常,但我觉得通过创建和销毁临时文件,我错过了一些非常明显的东西。
答案 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