此问题是对上一个问题的跟进: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
答案 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)
加快这一过程的一种方法(特别是如果你有很多行)是使用sort
与partial
匹配选项而不是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
输出中的第一个元素。我也会把这些特殊情况留给你。