[英]r- Reading from zip and matching with values from dataframe column
我正在尝试通过读取两个数据集来制作一个数据帧,但是我使用的方法极其缓慢-读取和处理600Mb数据可能需要长达10个小时的时间。 我相信必须有一种更快的方法来完成此操作,但是我想我看不到什么似乎正在减慢该过程。 下面是呈现这些步骤的可复制示例。
所需软件包:
library(tidyverse)
第一组是.csv
文件。 可以使用以下方法重新创建示例:
info <- data.frame(identification = c("a", "b", "c", "d", "e"), attr = c(0:4))
info %>% write_csv("folder/info.csv")
第二个是zip文件。 可以使用以下方法重新创建示例:
a <- data.frame(var = c(41:50), val = c(31:40))
a %>% write_csv("folder/file/a_df.csv")
b <- data.frame(var = c(41:50), val = c(31:40))
b %>% write_csv("folder/file/b_df.csv")
c <- data.frame(var = c(41:50), val = c(31:40))
c %>% write_csv("folder/file/c_df.csv")
d <- data.frame(var = c(41:50), val = c(31:40))
d %>% write_csv("folder/file/d_df.csv")
e <- data.frame(var = c(41:50), val = c(31:40))
e %>% write_csv("folder/file/e_df.csv")
files2zip <- dir('folder/file/', full.names = TRUE)
zip(zipfile = 'testZip', files = files2zip)
我使用的方法如下:
data1 <- read_csv("folder/info.csv")
read_from_zip <- function(identification) {
fn <- paste0("folder/file/", identification, ".csv")
# read zip files
zip_file <- paste0("./folder/testZip.zip")
id_2_zip <- unzip( zip_file
,files = fn)
df <- read_csv(id_2_zip)
}
df <- data1 %>% group_by(identification) %>% nest() %>%
mutate(trj = map(identification, read_from_zip))
df <- df %>% select(identification, trj) %>% unnest()
我猜这样的东西会起作用:
tmpdir <- tempfile()
dir.create(tmpdir)
便利向量,如果您希望:
filesvec <- paste0(letters[1:5], '.csv')
请注意,这需要是zipfile中列出的“ verbatim”,包括所有前导目录。 (您可以对unzip()
或system('unzip -j ...')
使用junkpaths=TRUE
删除前导路径。)过去,我是通过快速调用unzip(zipfile, list=TRUE)
创建此文件名矢量的unzip(zipfile, list=TRUE)
和grep
荷兰国际集团的输出。 这样,如果您小心的话,您将(a)在提取之前始终知道文件丢失,并且(b)不会在unzip()
内引起异常,也不会在system('unzip ...')
。 您可以这样做:
filesvec <- unzip(zipfile, list=TRUE)
filesvec <- filesvec[ grepl("\\.csv$", filesvec) ]
# some logic to ensure you have some or all of what you need
然后执行下列操作之一 :
unzip(zipfile, files=filesvec, exdir=tmpdir)
system(paste(c("unzip -d", shQuote(c(tempdir(), 'foo.zip', 'a.csv','b.csv')))))
在这里,您可以使用以下命令访问文件:
alldata <- sapply(file.path(tmpdir, filesvec), read.csv, simplify=FALSE)
列表的名称是文件名(包括前导路径?),其内容都应该是data.frame
。
完成后,是否清理临时文件取决于使用临时文件的OCD状况。 一段时间后,您的操作系统可能会为您清理它们。 如果空间有限或只是偏执,可以使用以下方法进行清理:
ign <- sapply(file.path(tmpdir, filesvec), unlink)
unlink(tmpdir, recursive=TRUE) # remove the temp dir we created
(您可以只使用第二个命令,但是如果您使用其他临时目录方法,我想我会小心的。)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.