列的最小值(大于0)与行操作相结合

时间:2013-02-18 04:52:55

标签: r

我试图从矩阵中的列获取最小值(大于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,等等(请注意,事实上,列被清零是这个例子的产物,通常不是真的)。​​

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)))