2017-06-15 19 views
0

この質問がうまく構築されていないと、私はRにとても謝っています。基本的に私は、多数の行の値を計算するために必要な断片的な関数を持っています。ベクトル化されたpiecwise関数を作成する関数R

f <- function(x){ 
    (x <= 1000) * x^2 + 
    (x > 1000 & x <= 2000) * x^3 + 
    (x > 2000 & x <= 3000) * x^4 + 
    (x > 4000) * x^5 
    } 

私が作成したり、ブレークポイント(すなわち多分1500,2500,3500など)の異なるセットのさまざまなと異なる数のため、この機能を一般化できるようにする必要がありますしかし:私の現在の機能は次のようになりますブレークポイントの。また、計算する必要がある多数の行がある場合、関数をベクトル化する必要があります。何かアドバイス?

編集:

明確にするために、私は(2,3,4,5)にXを高めるためにいくつかのブレークポイントのテーブル(1000,2000,3000,4000)および関連する力から上記機能を作りました。しかし、私は、ブレークポイントとブレークポイントの数(潜在的に100程度のブレークポイントを持つ)を持つこのようなテーブルの複数を取ることができ、結果として得られる区分的な関数を多数の行に適用できる必要があります。

+1

何がベクター化されていますか? 'x'?それはすでにです。 – Spacedman

+0

私が作った編集を見てください。私は関数がベクトル化されていることに気付いていますが、ブレークポイントを変えたり、ブレークポイント数を変えたりして、さまざまな種類の関数を再現するにはどうすればいいですか? @朴Pakこれは私を助けることができますか? –

答えて

0

追加の休憩とパワーの引数を使用して、関数のベクトル化バージョンは、このように書くことができます。

function(x, breaks, power){ 
x^power[as.numeric(cut(x, breaks))] 
} 

as.numeric(cut(...))は休憩中のすべてのx値の位置を取得し、その後、角括弧は、電力を検索します対応するxを正しい電力に上げます。テスト:

いくつかの休憩ポイントと力:ブレークポイントは、左除外され

> bp <- c(10,20,30,40) 
> po = c(2,3,4) 

注:

> f(9,bp,po) 
[1] NA 
> f(10,bp,po) 
[1] NA 

だから、最初の有効なxが10を超えることがあります。

> f(11,bp,po) 
[1] 121 

そして期待通りに11^2を取得します。だから20は平方になり、21は立方体になります。

> f(20,bp,po) 
[1] 400 

> f(21,bp,po) 
[1] 9261 

これまでのところ良いです。ベクトル化された?

> f(19:22, bp, po) 
[1] 361 400 9261 10648 

はい - あなたは間隔が左または右に閉じられるようにしたい場合はcut機能についてrightオプションのヘルプを参照してください

20〜21乗に広場からの変化が起こります。

+0

これはトリックです!ありがとうございました。 –

0

あなたのサンプルコードからわかるように、基本的にコーディングを最小限に抑えたいだけでなく、コードを動的にしたいので、ブレークとパワーを動的に変更することができます。

以下は同じことを試みるサンプルコードです。

f <- function(x, breakPoints, powerX) { 
    cutX <- cut(x, breaks=breakPoints) 
    cutX1 <- factor(cutX, labels=powerX) 
    retX <- x^as.numeric(as.character(cutX1)) 
    retX 
} 

x1 <- sample(1:10000, 1000) 
x1 <- x1[order(x1)] 
breakPoints1 <- c(min(x1)-1, 1000, 2000, 3000, max(x1)) 
powerX1 <- c(2, 3, 4, 5) 
newX1 <- f(x1, breakPoints1, powerX1) 

head(newX1) # manual check whether the values make sense 
head(x1) 

このコードはこれを行います。

私の提案は、できるだけこのコードをテストして、信頼性の高い方法で使用できるようにすることです。このコードが役に立つと願っています。

+0

この関数は、いくつかのケースで失敗します。ポイントがない区間があると思っています - 予想よりも少ないレベルのカットベクターを取得し、 "無効なラベル";長さ4は1または3です "エラーは、私はまだそれに深く見ていない。 – Spacedman

関連する問題