2017-06-15 36 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等)和不同數量的斷點。還需要計算大量的行,函數必須進行矢量化。有什麼建議?

編輯:

爲了澄清,我從斷點(1000,2000,3000,4000)和相關聯的功率的一些表中進行上面的功能,以提高x到(2,3,4,5)。不過,我需要能夠採用多個這樣的表格,每個表格都有不同的斷點和斷點數(可能有100個左右的斷點),並且能夠將生成的分段函數應用於大量的行。

+1

vectorised over what? 'x'?它已經是。 – Spacedman

+0

請參閱我所做的修改。我意識到這個函數是矢量化的,但是我怎樣才能用不同的斷點和不同的斷點數來重現它的許多不同的分段函數。 @Chi 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 

是 - 從廣場到立方體的變化發生20和21

之間,如果你想的時間間隔要在左邊或右邊關閉請參閱right選項爲cut功能的幫助。

+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