3

我试图从矩阵中的列中获取最小值(大于 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 这我玩了一点,没有诉诸循环,我不确定该怎么做。

回到例子,第一个值minInf,所以我的向量calc.results得到 0,下一个值是 3,所以我想min从矩阵中选择第 2 列 (3) 中的第 3 行,然后使用这个值来计算st中第 2 列的结果calc.results等。操作完成后calc.results看起来像(例如简单性,没有对来自 的值做任何事情st):

[1] 0 3 3

然后,我需要通过仅在到达前面标识的行(索引等于 的列)之后减去 的值来应用calc.results回矩阵。所有其他行都保持不变。stcalc.resultsminminst

在示例中,最终结果将如下所示:

     [,1] [,2] [,3]
[1,]    0    0    0
[2,]    0    0    0
[3,]    0    0    2

因为在第 2 列中, 的值为min3,第 2 列中的值为 3,仅在第 3 行的第 2calc.resultsst中减去了 3,依此类推(请注意,列被清零的事实是这个例子并不普遍)。

4

3 回答 3

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
于 2013-02-18T05:00:39.610 回答
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))

为避免警告,您可以添加 if 语句,function(v)例如:

apply(x, 2, function (v) min(ifelse(any(v>0), which(v>0), 0), na.rm = TRUE))

但是,请记住,这只是一个警告,只要您知道具体是什么原因造成的,就不必太担心。

于 2013-02-18T04:58:08.387 回答
0

问题(1):您至少可以识别没有任何最小值的列,然后根据需要删除它们。

min <- apply(x,2,function (v) ifelse(max(v)==0, NA , min(which(v>0), na.rm = TRUE)))
于 2013-02-18T05:04:27.570 回答