- 締切済み
データ解析ソフトRのベクトルと関数について
フリーのデータ解析ソフトRですが、以下のような処理を行いました。 x<-c(-2,-1,0,1,2) f(x) これは-2,-1,0,1,2という配列形式のデータ(ベクトル)に対して関数fをそれぞれの値に対して作用させて、結果をまたベクトルデータに保存します。 fの中身ですが、負と非負の場合に異なる処理になるようにしています。 f<-function(x){ if(x<0) return(.....) #負の場合の処理 else return(.......) #非負の場合の処理 } このような関数では場合分けが効かず、片方の処理(たぶん上側)しか有効ではありません。警告も出ますし、結果を図示してもそうなっています。符合による場合分けを有効にする方法を教えて頂きたいのですが。 よろしくお願いします。
- みんなの回答 (3)
- 専門家の回答
みんなの回答
#2です。 ?ifelse でヘルプを見れば分かりますが、一つ目の引数x<0で要素ごとに0未満かそうでないかを判定しています。その結果で真(0未満)の要素については二つ目の引数を、偽の要素については三つ目の引数を実行し、xと同じ形(xがベクトルなのでベクトル)で値が返ってきます。 一方、ifのカッコの中は一つの値しか入れられません。 従って、同じような動作にはならないのです。 そういう仕様なのでしかたありません。
こういう方法もあります。 > f <- function(x) ifelse(x<0,x+1,x+2) > f(-2:2) [1] -1 0 2 3 4
お礼
回答ありがとうございます。この方法で動作しました。内容を見てみると、関数の中で場合分けするという発想では元々(元質問)のところと違いがないように思えます(ifとかelseとか)。場合分けの書き方が違うだけですね。どうしてこちらだと動作するのでしょうか。Rのスクリプトも含めてプログラムは自然言語的で問題ないものであってほしいと思います。あれでダメで、これで良いという理由があるでしょうか。 よろしくお願いします。
- f272
- ベストアンサー率46% (8469/18132)
無理矢理に,こんな感じにしたらどうかな? f<-function(x){ temp<-function(x){ if(x<0) return(.....) #負の場合の処理 else return(.......) #非負の場合の処理 } sapply(x, temp) }
お礼
回答ありがとうございます。私のところではうまく動作しませんでした。 スクリプトの意味は、結果を一旦tempで受けて、それをsapplyでエラーにならないところだけ出すということですね。一理あると思いますが、動作しませんでした。
お礼
回答ありがとうございました。ある操作が1つの値(スカラー)に対するだけのものか、ベクトルの各要素に対して1つ1つにも対応するかどうかの違いということですね。これは仕様によりますね。要素番号1つ1つをループを回して見ていくというようなことをしないという実例が解説されていることが多くて便利だな、先進的だなと思っていました。そうでない場合もあるので要注意と理解しました。