• 締切済み

データ解析ソフト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(.......) #非負の場合の処理 } このような関数では場合分けが効かず、片方の処理(たぶん上側)しか有効ではありません。警告も出ますし、結果を図示してもそうなっています。符合による場合分けを有効にする方法を教えて頂きたいのですが。 よろしくお願いします。

みんなの回答

noname#227064
noname#227064
回答No.3

#2です。 ?ifelse でヘルプを見れば分かりますが、一つ目の引数x<0で要素ごとに0未満かそうでないかを判定しています。その結果で真(0未満)の要素については二つ目の引数を、偽の要素については三つ目の引数を実行し、xと同じ形(xがベクトルなのでベクトル)で値が返ってきます。 一方、ifのカッコの中は一つの値しか入れられません。 従って、同じような動作にはならないのです。 そういう仕様なのでしかたありません。

skmsk1941093
質問者

お礼

回答ありがとうございました。ある操作が1つの値(スカラー)に対するだけのものか、ベクトルの各要素に対して1つ1つにも対応するかどうかの違いということですね。これは仕様によりますね。要素番号1つ1つをループを回して見ていくというようなことをしないという実例が解説されていることが多くて便利だな、先進的だなと思っていました。そうでない場合もあるので要注意と理解しました。

noname#227064
noname#227064
回答No.2

こういう方法もあります。 > f <- function(x) ifelse(x<0,x+1,x+2) > f(-2:2) [1] -1 0 2 3 4

skmsk1941093
質問者

お礼

回答ありがとうございます。この方法で動作しました。内容を見てみると、関数の中で場合分けするという発想では元々(元質問)のところと違いがないように思えます(ifとかelseとか)。場合分けの書き方が違うだけですね。どうしてこちらだと動作するのでしょうか。Rのスクリプトも含めてプログラムは自然言語的で問題ないものであってほしいと思います。あれでダメで、これで良いという理由があるでしょうか。 よろしくお願いします。

  • f272
  • ベストアンサー率46% (8010/17118)
回答No.1

無理矢理に,こんな感じにしたらどうかな? f<-function(x){ temp<-function(x){ if(x<0) return(.....) #負の場合の処理 else return(.......) #非負の場合の処理 } sapply(x, temp) }

skmsk1941093
質問者

お礼

回答ありがとうございます。私のところではうまく動作しませんでした。 スクリプトの意味は、結果を一旦tempで受けて、それをsapplyでエラーにならないところだけ出すということですね。一理あると思いますが、動作しませんでした。

関連するQ&A

  • 解析関数とは。。?

    解析関数(Analytic Function)は 大雑把に言えば、冪級数(Power Series)で表せる f(x)=Σa(x-xo)^n のような関数だと思うのですが、 もし関数fが二個以上の変数に依存する場合、  f(x1,x2,...xn) 解析関数f(x1,x2..)とはどのような関数を指すのでしょうか? よろしくお願いします。

  • スカラー場.ベクトル場のイメージ 

    現在,独学でベクトル解析を勉強しているのですが, スカラー場 F(x,y,z),ベクトル場 F(x,y,z)=[f,g,h]の場のイメージが掴めません.(f,g,hは,x,y,zの関数です.) また,スカラー場 F(x,y)は3つの直交した軸上で表されると思うのですが,そのように考えると F(x,y,z)は図示できないような気がします. 実際は,どのようにイメージされているのでしょうか? 分かりにくい質問で申し訳ないのですが,ご回答宜しくお願いします.

  • 「R」でベクトル内のデータを合体するには?

    統計解析ソフトRで下記のようなベクトルを作成したいのですが、ご存じの方、よろしくお願いします。 X>-C(1,2,3,4,5) のベクトルから 隣接するデータを合体させて X>-C(12,23,34,45) のベクトルを作成したいのですが?

  • ベクトル場の解析についてです

    f(x,y)=[-y/(x^2+y^2) , x/(x^2+y^2)]で与えられる二次元のベクトル場がある時 (1) 単位円上の点P(がx軸とπ/4の角度を成す原点からの直線が単位円と交わる点、第一象限) におけるf(x,y)を図示せよ (2) ベクトル場f(x,y)の発散を求めよ(原点は除く)   (3) 単位円に沿ったf(x,y)の反時計回りの積分 ∫f(x,y)・ds を求めよ    (dsは線素ベクトル、・は内積を表す) という問題を出され、解いたところ次のような答えになりました (1)は dx/dt=λ(-y/x^2+y^2) dy/dt=λ(x/x^2+y^2)として計算、x^2+y^2=1 (単位円ですよね) (2)はdivなので ∂f/∂x + ∂f/∂y = 2xy/(x^2+y^2)^2 - 2xv/(x^2+y^2)=0 (3)は -∫y/(x^2+y^2) dx -∫x/(x^2+y^2) dy     x=acosθ y=asinθ とおいて dx=-asinθdθ dy=acosθdθ          これを代入して計算すると-π/2となりました これらは正しいのでしょうか?

  • 行列の固有ベクトルの問題を教えて下さい。

    この問題が分かりません。お願いいたします。 行列A= (cos2θ sin2θ) (sin2θ -cos2θ) がある。(0≦θ<π) 固有値と固有ベクトルを求め、固有ベクトルを図示しなさい。 という問題です。 解いてみると、固有値は1と-1だと分かりました。 しかし、固有ベクトルでつまっています。 例えば固有値1として求めると、 (cos2θ-1)x+sin2θy=0 x=1のとき、y=(1-cos2θ)/sin2θ としてsin2θ≠0のときと=0の時、みたいに場合分けしたのですが、図示出来ませんでした・・・。 固有ベクトルの良い取り方があるのでしょうか? 解答、お願いいたします

  • ベクトルについて

    高校物理の学習をしていたのですが、 → F=(-kx,0)というベクトルが出てきて、 このベクトルは一体何なのか分かりません。 x座標が-kxということで、x=-kxということになり、何が何だか 分かりません。前に同じような質問をして、 x=-kxではなく、Fx=-kxであるという回答をいただいたのですが、 どうも釈然としません。-kxはx座標上の成分ではなく、Fx座標上の成分 ということでしょうか?しかし、仕事を計算する際、x座標 方向の微小距離dxを-kxにかけるので、-kxはx座標上の成分である という解釈をせざるを得ないと思います。 また、図示すれば一体どのようになるのでしょうか? → F=(x,-kx)なら、図示できて、どんなベクトルか 理解できるんですけど…

  • ベクトル関数

    ベクトル関数について質問させて頂きます。 添付画像における、Gはベクトル関数を表します。 ベクトル成分で表した場合、 Gx(x,y,z),Gy(x,y,z),Gz(x,y,z) となりますが、この成分の意味がいまひとつ理解できません。 Gx(x,y,z)はスカラー(関数)という認識ですが正しいでしょうか? 3次元で、Gx(x,y,z)におけるGxとはベクトル関数Gのx成分を表し、 Gx(x,y,z)の(x,y,z)はスカラー関数Gxにおける変数を表すと いう認識で良いでしょうか? ベクトル関数Gのx成分をGxが表していて、そのGxが(x,y,z)の変数 で表されることがよくわかりません・・・ xを表すGxがなぜ、x,y,zの変数で表されるのでしょうか? 基底ベクトルで表す場合は、 G=Gxex+Gyey+Gzezとなりますが、 G=Gx(x,y,z)ex+Gy(x,y,z)ey+Gz(x,y,z)ez を省略して表しているという認識で良いでしょうか? 添付画像のベクトル関数の簡単な具体例も示して頂けると ありがたいです。 webで調べたのですがなかなか理解できる例がありません でした・・・ 以上、申し訳ありませんがご回答よろしくお願い致します。

  • ベクトル解析の問題

    R=(x,y,z) r=|R| f(r)はrの関数とするとき、 ▽^2f(r)=f"(r)+2/r*f'(r) が成り立つことを証明せよって問題なのですが、どなたか解放を教えてもらえませんか。 ちなみに▽^2はラプラシアン、Rはベクトルです。

  • ベクトルの微分について

    ●関数の微分値は、 {f(t+Δt)-f(t)}/Δt におけるΔtを 0でない値をとりながら 正側と負側の両側から0に近づけて(Δt→±0)、 極限値が+0の場合も、-0の場合も同じ値となることで、 微分値として正しいと確認しました。 ●ベクトルを微分する場合、正側から近づけた場合と 負側から近づけた場合で、 ベクトルの方向が正反対になってしまいます。 ベクトル微分は(定義も含め)どのように 考えれば宜しいのでしょうか。 ご回答、宜しくお願い致します。

  • 関数の掛け算を返す関数

    いま関数の積分を行おうとしています. この積分を行う関数が double integral(double (*func)(double), double a, double b ) {    double ans;    .....    return ans; } となっていて,aからbまでfuncが指す関数を積分して結果を返します. 積分をさせる関数は double f1(double x) { return 3.0*x; } double f2(double x) { return x*x; } となっていて,同じようにg1, g2も用意します.(本当は関数が3つ4つあります.) 例えばf1を積分したいとき, int main() {    double ans = integral(f1, a, b);    printf("%f\n", ans); } ですよね. 自分で積分する関数を選ぶときは,ここに配列で場合分けをして double (*func_f[])(double)={f1, f2}; scanf("%d", &flag); /* flagに0~1を代入 */ ans = integral(func_f[flag], a, b); でいいと思います. さて,そこで本題なのですが, double (*func_f[])(double)={f1, f2}; double (*func_g[])(double)={g1, g2}; としておいて, scanf("%d", flag1); scanf("%d", flag2); func_f[flag1], func_g[flag2]; として関数を入力側から決定して, (例えばflag1=1, flag2=1,であったとして *func_f[1]=x*x *func_g[1]=5.0*x ならば) h(x)=(x*x)*(5.0*x)=5.0*x*x*x という関数を作って, h(x)を指すポインタを double (*h_ptr)(double) とすれば ans = integral(h_ptr, a, b); としたいのです. (f1*g2)を一つの関数としてh(x)=(f1*g2)(x)というように扱うことができればいいと思うのですが. integralの引数で,関数のポインタを2個にすると,汎用性が失われてしまうと思うので,できればそこは変えたくないです. どのようにすればよいのでしょうか? また,「考え方を変えればよい」などの意見も頂きたいです. 皆様,どうぞよろしくお願いします.