2013-04-11 12 views
11

Esiste comunque la possibilità di accelerare il processo seguente in R?Modo più veloce per leggere più csv su un frame di dati?

theFiles <- list.files(path="./lca_rs75_summary_logs", full.names=TRUE, pattern="*.summarylog") 

listOfDataFrames <- NULL 
masterDataFrame <- NULL 

for (i in 1:length(theFiles)) { 
    tempDataFrame <- read.csv(theFiles[i], sep="\t", header=TRUE) 
    #Dropping some unnecessary row 
    toBeRemoved <- which(tempDataFrame$Name == "") 
    tempDataFrame <- tempDataFrame[-toBeRemoved,] 
    #Now stack the data frame on the master data frame 
    masterDataFrame <- rbind(masterDataFrame, tempDataFrame) 
} 

Fondamentalmente, sto leggendo più file CSV in una directory. Voglio combinare tutti i file csv in un gigantesco frame di dati impilando le righe. Il ciclo sembra funzionare più a lungo man mano che masterDataFrame aumenta di dimensioni. Sto facendo questo su un cluster Linux.

risposta

12

Risposta aggiornata con data.table::fread.

require(data.table) 
out = rbindlist(lapply(theFiles, function(file) { 
     dt = fread(file) 
     # further processing/filtering 
     })) 

fread() rileva automaticamente intestazione, separatore di file, classi di colonna, non convertire le stringhe di fattore di default .. maniglie citazioni embedded, è abbastanza veloce, ecc .. Visualizza ?fread di più.


Vedere la cronologia delle risposte precedenti.

+0

Grazie. rbindlist velocizza davvero le cose! – WonderSteve

+6

Usa 'fread' invece di' read.csv' se stai scendendo il percorso data.table .... – mnel

Problemi correlati