我试图从矩阵中的列获取最小值(大于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的索引从不同的矩阵中选择一个值{ {1}}我已经玩了一些,没有诉诸循环,我不知道该怎么做。
回到示例,st
中的第一个值为min
,因此我的向量Inf
为0,calc.results
中的下一个值为3,因此从matrix min
我想在第二列(3)中选择第三行,然后使用该值计算st
中第二列的结果,等等。操作完成后{{ 1}}看起来像(例如简单,没有用calc.results
的值完成):
calc.results
然后我需要通过在st
之前找到前面确定的行后减去[1] 0 3 3
的值来将calc.results
应用回矩阵st
(使用索引) calc.results
等于min
列的所有其他行保持不变。
在示例中,最终结果如下所示:
min
因为在第2列中,st
的值为3,而 [,1] [,2] [,3]
[1,] 0 0 0
[2,] 0 0 0
[3,] 0 0 2
的值在第2列中为3,min
在第2列中仅减去3 3,等等(请注意,事实上,列被清零是这个例子的产物,通常不是真的)。
答案 0 :(得分:2)
听起来你正试图做这样的事情:
apply(x, 2, function(y) { y[y > 0] <- (y[y > 0] - min(y[y > 0])); y })
[,1] [,2] [,3]
[1,] 0 0 0
[2,] 0 0 0
[3,] 0 0 2
答案 1 :(得分:0)
问题(1)
警告是由于你正在使用min
非数字,即integer(0)
# try this to see the warning clearly:
min(integer(0))
# try this to see where you are getting integer(0)
apply(x,2,function (v) which(v>0))
要避免此警告,您可以在function(v)
中添加if语句,例如:
apply(x, 2, function (v) min(ifelse(any(v>0), which(v>0), 0), na.rm = TRUE))
但是,请记住,这只是一个警告,只要您了解具体原因,您就不必担心它。
答案 2 :(得分:0)
问题(1):您至少可以在没有任何分钟的情况下识别列,然后根据需要将其删除。
min <- apply(x,2,function (v) ifelse(max(v)==0, NA , min(which(v>0), na.rm = TRUE)))