2016-09-06 148 views
2

我對R很新,但是要做程序。在這個階段我可能只是厭倦了自己的進步,所以這是我的問題;讀取,合併和排序.csv文件

大量的.csv文件,大量(6MB)帶有我需要做分析的頻譜數據。我試圖讀取數據 - 兩列頻率電壓(V爲dB值),每個文件500,000個數據點。我想在每10個文件的新數據集中「合併」來自第二列的數據。

例如:10個檔,十個頻率(所有相同每個所以可以暫時忽略不計)和十個電壓。從第二列中的電壓獲取數據並將其合併到數據集中。如果我有10個文件=我結束了一個數據集,100個文件= 10個數據集。希望最終每個數據集將有11列|頻率| V1 | V2 | ... | V10 |。對每個文件進行索引匹配會很好,但我不確定我的電腦能否支持它,除非我升級資源。

這看起來似乎很安靜,所有的建議都歡迎,當嘗試對1200個.csv文件進行排序或者甚至只讀取100個文件時,內存似乎成了一個問題。謝謝你的時間!

回答

0

我還沒有測試過,因爲我顯然沒有你的數據,但像下面的代碼應該工作。基本上,你創建一個包含所有文件名的矢量,然後一次讀取,合併和寫入它們中的10個。

library(reshape2) 
library(dplyr) 

# Get the names of all the csv files 
files = list.files(pattern="csv$") 

# Read, combine, and save ten files at a time in each iteration of the loop 
for (i in (unique(1:length(files)) - 1) %/% 10)) { 

    # Read ten files at a time into a list 
    dat = lapply(files[(1:length(files) - 1) %/% 10 == i], function(f) { 
    d=read.csv(f, header=TRUE, stringsAsFactors=FALSE) 
    # Add file name as a column 
    d$file = gsub("(.*)\\.csv$", "\\1", f) 
    return(d) 
    }) 

    # Combine the ten files into a single data frame 
    dat = bind_rows(dat) 

    # Reshape from long to wide format 
    dat = dcast(Frequency ~ file, value.var="Voltage") 

    # Write to csv 
    write.csv(dat, paste("Files_", i,".csv"), row.names=FALSE) 
} 

在另一方面,如果你只想他們都合併到長格式的單個文件,這將使得分析變得更容易(如果你當然有足夠的內存):

# Read all files into a list 
    dat = lapply(files, function(f) { 
    d = read.csv(f, header=TRUE, stringsAsFactors=FALSE) 
    # Add file name as a column 
    d$file = gsub("(.*)\\.csv$", "\\1", f) 
    return(d) 
    }) 

    # Combine into a single data frame 
    dat = bind_rows(dat) 

    # Save to csv 
    write.csv(dat, "All_files_combined.csv", row.names=FALSE) 
+0

尼斯一個@ eipi10,感謝您的快速回復。 14號線我真的很感激,一直在尋找!幾個問題; 1)你能解釋'in'函數嗎?找不到對它的引用。 2)第14行'rbind'或'bind_rows',它看起來像你的設置數據的行,我用來傳播工作表和矩陣組數據,你能解釋爲什麼嗎?這是一個R的東西?! –

+0

'for(var in seq)'是我能想到的R中唯一的情況,其中'in'用於邏輯表達式中。這只是設置'for'循環迭代的一種方式。在這種情況下,我們使用它來選擇10行作爲時間。在其他上下文中,爲了在向量之間進行匹配,您可以使用'%in%'作爲'%y'中的'x%'。請參閱'?\'%在%\''和'?Control'中獲取更多信息。 – eipi10

+0

關於'rbind'與'bind_rows':'rbind'是用於堆棧兩個數據幀或矩陣的基本R函數。但是,如果列表中有多個數據幀,並且想要將它們全部堆疊起來,則可以執行'do.call(rbind,dat)'。 'do.call'在整個數據幀列表上迭代調用'rbind'。 'bind_rows'是一個在整個列表上運行的'dplyr'函數。 'bind_rows(dat)'和'do.call(rbind,dat)'在這種情況下是等價的。但是,如果數據框不是全部具有相同的列名稱或相同數量的列,則'bind_rows'也可以工作。 – eipi10