1

这个问题是对上一个问题的跟进:min value(greater than 0) from column combined with row operation

本质上,我需要使用来自不同矩阵(相同行/列)的值作为参数传入 apply 的匿名函数。

我的代码是

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

我需要将第 2 列的值 102.34 传递给函数的第一个参数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
    }
  }
}
4

2 回答 2

1

您可以通过更改您applysapply遍历列,例如:

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
于 2013-02-18T07:30:25.570 回答
1

一种加快速度的方法(特别是如果你有很多行)是使用sortmatchpartial选项而不是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 的相同,但如果您有更多行(因为它执行 a partial sort)会更快。

由于我不确定您想如何处理关系(如果有 > 1 倍的相同值 > 0),我将输出作为列表给出。如果您确定没有关系,您可以更改lapplysapply. 例如,如果存在平局,则可以仅从lapply输出中选择第一个元素。我也会把这些特殊情况留给你。

于 2013-02-18T09:32:47.077 回答