【问题标题】:min value(greater than 0) from column combined with row operation列结合行操作的最小值(大于 0)
【发布时间】:2013-02-18 04:52:54
【问题描述】:

我正在尝试从矩阵中的列中获取最小值(大于 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 的索引从不同的矩阵中选择一个值 @ 987654326@这个我玩了一会儿,没有使用循环,不知道该怎么做。

回到例子,min中的第一个值是Inf,所以我的向量calc.results得到0,min中的下一个值是3,所以从矩阵st我想选择第 2 列 (3) 中的第 3 行,然后使用该值计算 calc.results 等中的第 2 列的结果。操作完成后,calc.results 看起来像(例如简单性,什么都不是使用来自st 的值完成):

[1] 0 3 3

然后我需要将calc.results 应用回矩阵st,方法是仅在我到达前面在min 中标识的行之后减去calc.results 的值(min 的索引等于st) 所有其他行都保持不变。

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

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

因为在第 2 列,min 的值为 3,而在第 2 列 calc.results 的值为 3,st 在第 3 行的第 2 列中减去了 3,等等(注意事实上,列清零是此示例的产物,通常不正确)。

【问题讨论】:

  • 使用which.min,.....
  • 我玩过,但无法让它正常工作。

标签: r


【解决方案1】:

听起来你正在尝试做这样的事情:

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

【讨论】:

  • 是的。这给了我一些可以玩的东西并尝试理解。额外的x在apply函数末尾有什么作用? (我认为这与返回整行有关?)
  • @user1790121,是的。这只是返回匿名函数的整个值(我应该将其更改为“x”以外的其他值,因为我们也在处理一个名为“x”的对象,可能会引起一些混乱)。
  • 很酷,我现在明白了。你刚刚教我你可以做到。酷!
  • 我在这里的解决方案遇到了一个问题。我需要从我的匿名函数(相同位置)中的不同矩阵中获取一个值,以便计算所需的差异。在我的示例中,我将矩阵称为st。关于如何做到这一点的任何提示?
  • 我的代码到目前为止看起来像这样:apply(dv, 2, function(y) { y[y&gt;0] &lt;- (y[y&gt;0] - blacksch(min( ifelse(any(y&gt;0), y[y&gt;0], 0)),k,sigma,r, (min(ifelse(any(y&gt;0), (which(y&gt;0)/steps) *t ,0)))) ); y }) 问题是 blacksch 的第一个参数需要是来自不同矩阵的值(但在同一位置(行/列)作为最小值来自dv 矩阵。也许这应该是一个新问题?
【解决方案2】:

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

min <- apply(x,2,function (v) ifelse(max(v)==0, NA , min(which(v>0), na.rm = TRUE)))

【讨论】:

  • 太棒了,所以如果我将它们设置为 NA,那么 min 中的 na.rm = TRUE 实际上会有所作为。
【解决方案3】:

问题(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))

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

【讨论】:

  • 啊是的。有时有没有值 > 0 的列,但我如何“保护”自己免受这种情况的影响?
  • 您可以发表if 声明(我编辑了我的答案以反映)。然而,@Ananda Mahto 的回答似乎很恰当
  • 我同意,但感谢您的帮助!
猜你喜欢
  • 2020-01-12
  • 1970-01-01
  • 1970-01-01
  • 2022-01-07
  • 1970-01-01
  • 1970-01-01
  • 2017-01-12
  • 2020-06-06
  • 1970-01-01
相关资源
最近更新 更多