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