2017-07-28 12 views
0

私はプログラミングの初心者であり、指定されたモニターのリスト全体の汚染物質(硝酸塩または硫酸塩)の平均を計算する関数をRで作成しようとしています各モニタは "specdata"というフォルダに独自の.csvファイルがあります)。私は次の関数を構築している:R:警告:私の関数を使用しようとするとNAを取得する

pollutantmean <- function(directory="specdata", pollutant="sulfate", id=1:332) 
{ 
    files_f<-list.files(directory,full.names=TRUE) 
    d <- data.frame() 

    for(i in 1:332){ 
     d <- rbind(d,read.csv(files_f[i])) 
    } 
    if(pollutant=="sulfate"){ 
     mean(d$Sulfate[which(d$ID==id)], na.rm=TRUE) 
    } 
    else{ 
     mean(d$Nitrate[which(d$ID==id)], na.rm=TRUE) 
    } 
} 

をそして私はとの機能をテストしてみました:私は、次のエラーを取得する pollutantmean(directory="specdata",pollutant="sulfate", id=1:10)

[1] NA Warning messages: 
1: In d$ID == id : 
longer object length is not a multiple of shorter object length 
2: In mean.default(d$Sulfate[which(d$ID == id)], na.rm = TRUE) : 
argument is not numeric or logical: returning NA 

これは何を意味するのでしょうか?私はコードを何度も繰り返してきましたが、問題の内容を特定することはできません。

ありがとうございます。

+1

は、(1)あなたのコードは 'files_f [i]は'を参照して、「その範囲外に到達」され、この範囲違反は避けるべきで幸運; (2)あなたは 'id:'と 'for'ループの両方に' 1:332'をハードコードしていますが、それは意図的ですか? (3)あなたの問題は、長さの異なる2つのベクトルを比較しているためです(両方とも1より大きい)。結果が '1:4 == 1:3'にあると提案するものは何ですか? (これは明らかに「1:4 == 1」と「1 == 1:3」ですが、両辺はベクトルではありません) – r2evans

+4

(4)[このCourseraのトピックは死にました](https:// stackoverflow.com/search?q=%5Br%5D+pollutantmean) –

+3

rich ...あなたは#4あなたの宿題のあなたの不正行為に私を打つ! – sconfluentus

答えて

0

ここで私はコメントに提案を実装し、コードを短縮し、他の汚染物質を調査したい場合に備えて関数を一般化していると思います。(これらはcsvのものと同じです総額):

pollutantmean <- function(directory="specdata", 
           pollutant="Sulfate", 
           id=1:332){ 
     files_f <- list.files(directory,full.names=TRUE) 
     d <- do.call(rbind, lapply(files_f, read.csv, stringsAsFactors=FALSE)) 
     mean(d[[pollutant]][which(d$ID %in% id)], na.rm=TRUE) 
    } 

希望働き、汚染物質のモニタリング

+1

'd < - data.frame()/ for 'を' d

+0

ありがとうございました。私はあなたのコードを試してみました[1] NAとエラー "警告メッセージ: mean.default(d [[汚染物質]] [(d $ ID%in%id)]、na.rm = TRUE): 引数が数値でも論理的でもありません:NAを返す " - なぜ引数が数値ではないのか分かりません。何かご意見は?それはd $ IDまたはIDに問題がありますか? @RuiBarradasまた、私はあなたの推薦されたコードに潜んで同じエラーメッセージを得る。 – Jab

+0

@ Jab: 'd $ ID'には問題があるかもしれませんが、' factor'クラスである可能性があります。しかし、私が見る限り、私のコードはAlexPのものと同等です。伝える方法は 'mean(...)'命令の前に 'print(class(d $ ID))'文を入れることです。 –

関連する問題