我试图从矩阵中的列中获取最小值(大于 0),然后使用发生最小值的行号来计算一个值(作为公式)应用于最小值行以下的所有行(已识别之前)。
让我用一个例子来演示:如果我将 x 定义为:
x<-rbind(c(0, 0, 0), c(0,0,3), c(0,3,5))
就是这样x
:
[,1] [,2] [,3]
[1,] 0 0 0
[2,] 0 0 3
[3,] 0 3 5
那么我想确定第 1 列没有最小值,第 2 列在索引 3 处有最小值,第 3 列在索引 2 处有最小值。
因此,我创建了以下尝试来创建最小值向量:
min<-apply(x,2,function (v) min(which(v>0), na.rm = TRUE))
这给了我一个警告:
Warning message:
In min(which(v > 0), na.rm = TRUE) :
no non-missing arguments to min; returning Inf
(问题1):我不知道如何避免。
(问题2):我现在需要取最小值的结果(存在一个)并根据向量min的值计算一个函数的值,以及使用向量min的索引来选择一个值从不同的矩阵st
这我玩了一点,没有诉诸循环,我不确定该怎么做。
回到例子,第一个值min
是Inf
,所以我的向量calc.results
得到 0,下一个值是 3,所以我想min
从矩阵中选择第 2 列 (3) 中的第 3 行,然后使用这个值来计算st
中第 2 列的结果calc.results
等。操作完成后calc.results
看起来像(例如简单性,没有对来自 的值做任何事情st
):
[1] 0 3 3
然后,我需要通过仅在到达前面标识的行(索引等于 的列)之后减去 的值来应用calc.results
回矩阵。所有其他行都保持不变。st
calc.results
min
min
st
在示例中,最终结果将如下所示:
[,1] [,2] [,3]
[1,] 0 0 0
[2,] 0 0 0
[3,] 0 0 2
因为在第 2 列中, 的值为min
3,第 2 列中的值为 3,仅在第 3 行的第 2calc.results
列st
中减去了 3,依此类推(请注意,列被清零的事实是这个例子并不普遍)。