2013-02-18 67 views
1

這個問題是一個跟進到以前的問題:min value(greater than 0) from column combined with row operation使用價值在應用

從本質上講,我需要從歧矩陣(同一行/列)中的值,以傳遞作爲參數適用的自治功能。

我的代碼是

apply(dv, 2, function(y) { y[y>0] <- (y[y>0] - 
             blacksch(min(
             ifelse(any(y>0), y[y>0], 0)),k,sigma,r, 
               (min(ifelse(any(y>0), (which(y>0)/steps) *t ,0)))) 
            ); 
          y }) 

min( ifelse(any(y>0), y[y>0], 0))需要是從一個不同的矩陣st但在完全相同的位置(行/列方式)如在DV的值。

作爲一個例子,我可以具有以下兩個矩陣DV和ST:

> dv 
    [,1] [,2] [,3] 
[1,] 0 0 0 
[2,] 0 0 3 
[3,] 0 3 5 
> st 
    [,1] [,2] [,3] 
[1,] 100 100.00 100.00 
[2,] 100 100.00 102.95 
[3,] 100 102.34 104.88 

我需要在值102.34通過爲第2列到函數blacksch的第一個參數(因爲這相當於相同的位置,在矩陣的第2列的最小值大於0 dv

所以我知道這不是正確的,但這樣的:

apply(dv, 2, function(y) { y[y>0] <- (y[y>0] - 
              blacksch(st[minimum position of value greater than 0 in dv for each column],k,sigma,r, 
                (min(ifelse(any(y>0), (which(y>0)/steps) *t ,0)))) 
             ); 
           y }) 

我想我也應該提到,我不僅需要st的最小值,還需要「當前」值(如果我要在循環中編寫此代碼,我將執行類似於嵌套for循環的操作)

我的解決方案是不是真的將R的方式(因此從可怕的性能會受到影響):

for(j in 1:paths) 
{ 
    minrow=0 
    for(i in 1:steps) 
    { 
    if (dv[i,j]>0 && minrow==0) 
    { 
     minrow=i 
     bsminrow=blacksch(st[i,j],k,sigma,r, i/steps * t) 
    } 
    else if (minrow!=0) 
    { 
     dv[i,j]=blacksch(st[i,j],k,sigma,r,i/steps* t) - bsminrow 
    } 
    } 
} 

回答

1

的一種方式加快速度(特別是如果你有很多行)是使用sortpartial匹配選項,而不是order,因爲它獲得所有索引> 0(來自@ agstudy的答案)。

lapply(seq_len(ncol(dv)), function(x) { 
    idx <- ifelse (any(dv[,x] != dv[1,x]), 
      which(dv[,x] == sort(unique(dv[,x]), partial=2)[2]), 
      seq_along(dv[,x])) 
    st[idx, x] 
}) 

# [[1]] 
# [1] 100 
# 
# [[2]] 
# [1] 102.34 
# 
# [[3]] 
# [1] 102.95 

基本上,對於每列,取dv's第二「最低」指數,並獲得對應st值。如果0始終是您的最低要求,那麼它會爲您提供與agstudy相同的確切結果。我認爲這是你的情況。因爲,如果最大值是0,你拿哪一個? (當然這些都是特例,我會留給你的)。此解決方案與agstudy的工作方式相同,但如果行數更多(因爲它執行partial sort),它將更快。因爲我不確定你想如何處理關係(如果有> 1次相同的值> 0),我已經把輸出作爲一個列表。如果您確定沒有關係,則可以將lapply更改爲sapply。例如,如果存在關係,則可以從lapply輸出中選擇第一個元素。我會把這些特殊情況留給你。

+1

+1!說得好!高興地發現部分排序選項! – agstudy 2013-02-18 09:40:27

+0

這太好了。我很感激你留下一些點給我練習。 – mrkb80 2013-02-18 18:35:58

1

您可以通過sapply改變你apply遍歷列比如:

sapply(1:ncol(dv), function(y) {  
       h <- st[,y]    ## y is column number  
       y <- dv[,y]    ## y is column now 
       st.par <- ifelse(any(y)> 0, 
       h[head(which(y[order(y)] >0),1)], ## I order here to and I choose the first one 
                ## > 0 
       h[1]) 
       st.par 
       ###..... here you call your custom function 
       ###blacksch(st.par,...) 
}) 

1] 100.00 102.34 102.95 
+0

從性能的角度來看,這是最好的嗎?我編輯了這個問題來添加我非常可怕的'un-R'解決方案(使用嵌套循環)。 – mrkb80 2013-02-18 07:40:26

+0

如果性能是一個問題,您可能需要查看data.table。我被轉到它通過SO,並已被絕對吹走 – 2013-02-18 07:46:45

+0

數據。表有趣,看起來有點像SQL R – mrkb80 2013-02-18 07:51:50