2014-04-11 48 views
1

我有一堆CSV文件,我想對每個文件中的數據執行相同的分析(在R中)。首先,我假定每個文件都必須讀入R中(而不是在CSV上運行函數並提供輸出,如sed腳本)。從R中的多個.csv文件讀取,處理和導出分析結果

將多個CSV文件輸入到R中以便執行分析然後爲每個輸入輸出單獨結果的最佳方法是什麼?

感謝(順便說一句,我爲完整的R新手)

+0

我會建議'for'循環:) – Jealie

+1

我會建議一個函數,並且可能會從'for'循環中調用它;-) – janos

回答

0

您可以通過將所有CSV文件在同一目錄下試試下面的代碼。

names = list.files(pattern="*.csv") %csv file names 
for(i in 1:length(names)){ assign(names[i],read.csv(names[i],skip=1, header=TRUE))} 

希望這有助於!

1

可以去肖恩的選擇,但它會導致幾個問題:

  1. 最終你會與環境中很多不相關的對象的,具有相同名稱的文件他們屬於。這是一個問題,因爲...
  2. For循環可能會非常緩慢,並且因爲你有這麼大堆不相關的對象,所以你將不得不依賴循環遍歷文件名中的每個後續部分分析 - 否則,你會記得什麼對象被命名,以便你可以給他們打電話?
  3. 通過以字符串的形式粘貼它們的名字來調用對象 - 這是你必須做的事情,因爲再一次,你唯一記錄的東西就是這個字符串列表 - 這是一個真正的痛苦。當你不能在代碼中寫下它的名字時,你有沒有嘗試過調用一個對象?我有,而且這很可怕。

更好的做法可能與lapply()

# List files 
filelist <- list.files(pattern = "*.csv") 

# Now we use lapply to perform a set of operations 
# on each entry in the list of filenames. 
to_dispose_of <- lapply(filelist, function(x) { 

    # Read in the file specified by 'x' - an entry in filelist 
    data.df <- read.csv(x, skip = 1, header = TRUE) 

    # Store the filename, minus .csv. This will be important later. 
    filename <- substr(x = x, start = 1, stop = (nchar(x)-4)) 

    # Your analysis work goes here. You only have to write it out once 
    # to perform it on each individual file. 
    ... 

    # Eventually you'll end up with a data frame or a vector of analysis 
    # to write out. Great! Since you've kept the value of x around, 
    # you can do that trivially 
    write.table(x = data_to_output, 
       file = paste0(filename, "_analysis.csv"), 
       sep = ",") 
}) 

並完成。

+0

您可以創建一個空的輸出文件(函數外部),然後使用'write.table'調用中的append = TRUE,並將所有結果集中在一個文件中。 – marbel

+0

然而,測試是「爲每個文件輸出不同的結果」。 –

+0

@Ironholds嗯,沒有運氣,我很害怕。是''函數(x)「'從字面上使用?另外,有沒有支架?我沒有看到'lapply(filelist')的結束括號,再次對新手問題抱歉,謝謝。 – ijf