在申请中使用来自不同矩阵的值

时间:2013-02-18 06:43:48

标签: r

此问题是对上一个问题的跟进: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的最小值的相同位置) 1}}

所以我知道这不正确但是像:

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 }) 的最小值,还需要'当前'值(如果我在循环中写这个,我会做类似于嵌套的环)

我的解决方案并非真正的R方式(因此遭受可怕的表现):

st

2 个答案:

答案 0 :(得分:1)

您可以按apply更改sapply以循环显示列,例如:

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

答案 1 :(得分:1)

加快这一过程的一种方法(特别是如果你有很多行)是使用sortpartial匹配选项而不是order,因为它获得了所有索引&gt ; 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倍相同值&gt; 0),我已将输出作为列表给出。如果您确定没有联系,可以将lapply更改为sapply。如果存在联系,那么您可以选择lapply输出中的第一个元素。我也会把这些特殊情况留给你。