2016-04-14 172 views
0

我正在Cousera上介紹R編程課程。第一項任務是評估指定目錄中數百個csv文件的列表(「./specdata/」),每個csv文件又包含數百個大氣中樣本污染物數據記錄 - 日期,亞硫酸鹽樣本,硝酸鹽樣本和標識採樣位置的IDR for循環 - 在循環外追加結果

該任務要求我們創建一個函數,該函數將污染物作爲採樣位置的id或id範圍,並返回樣本均值,並給出所提供的參數。

我的代碼(如下)使用一個for循環使用id參數爲只讀感興趣的文件(不是做任何處理之前,所有322個讀取文件似乎更有效)。這偉大工程。

在循環中,我將csv文件的內容分配給一個變量。然後,我將該變量作爲數據框,並使用rbind將每個循環中讀入的文件追加到它。我使用na.omit從變量中刪除丟失的文件。然後我使用rbind將循環的每次迭代的結果追加到變量中。當我在循環內打印數據框變量時,我可以看到完整的列表,按id進行分組。但是當我在循環外打印變量時,我只能看到id向量中的最後一個元素。

我想創建一個與循環內的id參數匹配的所有記錄的綜合列表,然後將合併列表傳遞到循環外進行進一步處理。我無法得到這個工作。我的代碼如下所示。

這是錯誤的方法?似乎它可以工作。非常感激任何的幫助。我搜索了StackOverflow,找不到任何能夠解決我想要做的事情。

pmean <- function(directory = "./specdata/", pollutant, id = 1:322) { 

    x <- list.files(path=directory, pattern="*.csv") 
    x <- paste(directory, x, sep="") 

    id1 <- id[1] 
    id2 <- id[length(id)] 

    for (i in id1:id2) { 

    df <- read.csv(x[i], header = TRUE) 
    df <- data.frame(df)   
    df <- na.omit(df) 
    df <- rbind(df) 

    print(df) 

    } 

    # would like a consolidated list of records here to to do more stuff, e.g. filter on pollutant and calcuate mean 

} 
+0

[list.files](http://www.inside-r.org/r-doc/base/list.files)有一個* full.names *(默認設置爲False)參數,所以不需要粘貼目錄。另外,read.csv不會導入數據框,所以不需要'data.frame()'行。而'na.omit()'可能是多餘的,因爲'list.files'從指定的路徑中選擇所有非丟失的文件。如果你的意思是跳過空行,[read.table](http://www.inside-r.org/r-doc/utils/read.csv),'read.csv'的派生函數就有這樣一個參數(默認爲真)。 – Parfait

回答

0

您可以在for循環之外定義數據框並追加到它。您也可以通過調用只有你df <- rbind(df)有效覆蓋df每次跳過之間......還有更多的方法來改善這裏... :-)

pmean <- function(directory = "./specdata/", pollutant, id = 1:322) { 

    x <- list.files(path=directory, pattern="*.csv") 
    x <- paste(directory, x, sep="") 

    df_final <- data.frame() 
    for (i in id) { 

    df <- read.csv(x[i], header = TRUE) 
    df <- data.frame(df)   
    df <- na.omit(df) 
    df_final <- rbind(df_final, df) 

    print(df) 

    } 

    # would like a consolidated list of records here to to do more stuff, e.g. filter on pollutant and calcuate mean 
    return(df_final) 
} 
0

一些步驟。你可以做這樣的事情解決這個問題:

df = data.frame() # empty data frame 
for(i in 1:10) { # for all you csv files 
    x <- mean(rnorm(10)) # some new information 
    df <- rbind(df, x) # bind old dataframe and new value 
} 

順便說一句,如果你知道有多大df將事先那麼這是不這樣做的正確方法。