看板 R_Language 關於我們 聯絡資訊
※ 引述《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的格式 之後要讀也比較容易 -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 36.235.42.68 ※ 文章網址: https://www.ptt.cc/bbs/R_Language/M.1522760673.A.C86.html ※ 編輯: celestialgod (36.235.42.68), 04/03/2018 21:12:03
Luluemiko: 推 04/03 23:42
hotlin0709: 嗯嗯謝謝您的回覆感恩感恩xdd 04/04 17:18
hotlin0709: 嗯嗯是的在用交通部高速公路的資料哈哈 04/04 17:19