2016-04-14 12 views
0

私はCouseraで入門的なRプログラミングコースを取っています。最初の割り当てでは、指定されたディレクトリ( "./specdata/")にある数百のcsvファイルのリストを評価します。各csvファイルには、大気中のサンプル汚染物質データの数百のレコードが含まれています、硝酸塩のサンプル、およびそのIDは、サンプリング位置を特定します。ループのためのRループの外側に結果を追加する

この割り当てでは、サンプリング場所のIDまたはID範囲を汚染物質に取り込み、指定された引数(下記)。

マイコードのみが興味のあるファイルを読むためにid引数を使用するforループを使用しています(任意の処理を実行する前に、すべての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()'行は必要ありません。また、 'list.files'が指定されたパスから欠落していないファイルをすべて選択するので、' na.omit() 'は重複する可能性があります。空白行をスキップすることを意味するならば、[read.table](http://www.inside-r.org/r-doc/utils/read.csv)の 'read.csv'の派生関数はそのような引数を持ちます(デフォルトTrueへ)。 – Parfait

答えて

0

データフレームをforループの外に定義して追加することができます。また、あなたはあなたが効果的にdf毎回上書きされdf <- rbind(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は、事前になりますどのように大きな知っていれば、これはそれを行うための適切な方法ではありません。

関連する問題