Re: [问题] for循环读取大量csv

楼主: celestialgod (天)   2018-04-03 21:04:29
※ 引述《hotlin0709 (hotlin0709)》之铭言:
: [问题类型]:使用for循环读取多资料夹内多个csv 处理
: 效能咨询(我想让R 跑更快)
: [软件熟悉度]:
: 入门(写过其他程式,只是对语法不熟悉)
: [问题叙述]:
: 我要读取多个资料夹内的多个csv,然后读进来后,全部资料做简单的处理filter一些变量,
: 并将撷取完资料的某一字段加总起来。
: 以下是我写的方式,但是跑太久了......请问有比较快速的方法吗?
: [程式范例]:
: library(dplyr)
: l<- list.files(path="/users/Johnny/downloads/M08A",pattern="*")
: bindtemp <- data.frame()
: temp <- data.frame()
: for (k in l){
: ll<- list.files(path=paste("/users/Johnny/downloads/M08A/",k,sep = ''),pattern="*")
: for (i in ll) {
: file_names <- paste("/users/Johnny/downloads/M08A/",k,i,sep = '/')
: files <- list.files(path=file_names, pattern="*")
: for (file in files) {
: bindtemp <- read.csv(paste(file_names,file,sep="/"),header=F)
: temp <- rbind(temp,bindtemp)
: }
: }
: }
: df3<-temp %>% filter((V3=="03F0961N"|V3=="03F0846S"),V4==31) %>% summarise(n=sum(V5))
: [关键字]:
: for循环 读取多资料夹的CSV
觉得M08A好像在哪看过= =? 你是在用交通部的资料吗
而且V3 filter的条件看起来像是VD ID,03F0961N是国道三号北上车道961公里吧XD
你的程式主要问题是不断扩增data.frame,造成不断重复复制
第二个问题是没必要用到三层循环,只需要recursive = TRUE就可以解决了
所以这两个问题用下面这样就可以解决,范例code如下:
library(data.table)
# 直接用list.files直接取得全部的csv档案 (recursive = TRUE)
csvFiles <- list.files(path="/users/Johnny/downloads/M08A",
pattern="\\.csv$", recursive = TRUE)
# 开一个空间存读进来的资料
temp <- vector("list", length(l))
for (i in seq_along(csvFiles))
temp[[i]] <- fread(csvFiles[i]) # 读进每一个csv资料
DF <- rbindlist(temp) # 把list of data.table/data.frame合并成一个
setDF(DF) # 转回去成data.frame
剩下就看你DF要拿去做什么了
建议可以把这个常用的资料直接存成一些可以快速import的格式
之后要读也比较容易
作者: Luluemiko (露露)   2018-04-03 23:42:00
作者: hotlin0709 (hotlin0709)   2018-04-04 17:18:00
嗯嗯谢谢您的回复感恩感恩xdd嗯嗯是的在用交通部高速公路的资料哈哈

Links booklink

Contact Us: admin [ a t ] ucptt.com