2016-10-14 4 views
0

は私が次のアドレスに割り当てパート2をやってる:forループの使用を減らすためにRプログラムを変更するには?

https://www.coursera.org/learn/r-programming/supplement/amLgW/programming-assignment-1-instructions-air-pollution

質問:zipファイルが細かい粒子状物質のための汚染監視データを含む332カンマ区切り(CSV)ファイルが含まれて (PM )大気汚染は米国の332カ所にあります。各ファイルには1つのモニターからのデータが含まれ、各モニターのID番号はファイル名に含まれています。例えば、モニタ200用のデータは、ファイル「200.csv」に含まれている。

日付:YYYY-MM-DD形式(年月日)の観測日 硫酸塩:その日の大気中の硫酸塩PMのレベル(マイクログラム/秒で測定)硝酸塩:その日の空気中の硝酸塩PMのレベル(マイクログラム/立方メートルで測定) このプログラミング割り当てのために、このファイルを解凍し、ディレクトリ 'specdata'を作成する必要があります。 zipファイルを解凍したら、 'specdata'ディレクトリのファイルを変更しないでください。各ファイルでは、硫酸塩または硝酸塩(またはその両方)が欠けている(NAとしてコード化されている)日が多いことに気付くでしょう。これは、米国の大気汚染モニタリングデータに共通しています。

パート2

ファイルの完全なディレクトリを読み込み、各データファイルの完全観察例数を報告機能を記述します。この関数は、最初の列がファイルの名前で、2番目の列が完全なケースの数であるデータフレームを返す必要があります。

complete <- function(directory="d:/dev/r/documents/specdata", id) { 
df <- data.frame(no=integer(), nobs=integer()) 
for (i in id) { 
    sum=0 
    myfilename = paste(directory,"/",formatC(i, width=3, flag="0"),".csv", 
         sep="") 
    masterfile = read.table(myfilename, header=TRUE, sep=",") 
    for (j in 1:nrow(masterfile)){ 
     if (!is.na(masterfile[j, 2]) && !is.na(masterfile[j, 3])){ 
      sum = sum + 1 
     } 
    } 
    df[i,]<-c(i, sum) 
} 
df 
} 

私は、ディレクトリdの中のすべての001.csv、002.csvを、...置く注:

私のコードは次のようには/ dev/R /文書/ specdata、それはですなぜ私はこの文字列をパラメータにデフォルトとして持つのですか?あなたはこの作業をするためにネストされたforループを使用していることがわかります。少なくともforループの1つをlapplyに置き換えることができるはずです。しかし、私はC++に精通しているので、これで苦労しているので、lapplyを実装する方法は実際には分かりません。私はStackoverflowでいくつかのコードを読んで、私はそれらのほとんどを理解していますが、自分のコードを書くことになったとき、私はそれを動作させることができませんでした。

ありがとうございます!その間、私はもう一度やり直します。

答えて

1

あなたはこのようなものを第一の内側のサイクルを交換して起動することもできます。

rows_to_sum <- !is.na(masterfile[, 2]) & !is.na(masterfile[, 3]) 
df[i,] <- sum(masterfile[rows_to_sum, 1]) 
+0

ありがとうございます! Laurenはcomplete.cases()について言及し、それを最初の行に入れます。助けてくれてありがとう。 –

+0

GoogleのためのRキーワードは 'ベクトル化'です。効率化のためにすべてのものをメモリに持っているときに役立ちますが、外部/ファイルループで絶対に必要とは思われません。また、古いSOの人々はコメントに「感謝」を入れたときに気に入らない: - 注意: – Ivan

+0

ええ、私はいくつかの例をチェックしたが、私はC++についてはあまりにも快適だと思うので、まだ苦労している。 –

1

この割り当ては、あなたのフレーズ「完全な例」を複数回使用してヒントを与えます。 R関数complete.cases()をチェックアウトする必要があります。それはあなたの内側forループの必要性を置き換えるでしょう。

各ファイルについて、complete.cases(file)を実行します。返されたベクトルのTRUE 要素の数を数えます。ファイルの名前と上記の数字の を出力します。

+1

ありがとう、私はRにこの機能があり、本当に助けに感謝しているのか分からない! –

関連する問題