【问题标题】:How to replace NaN and Inf using 1 of the 2 matrices value?如何使用 2 个矩阵值中的 1 个替换 NaN 和 Inf?
【发布时间】:2015-12-01 06:56:51
【问题描述】:

我有 2 个包含 100 列和 10,000 行的大型矩阵。我试图将a 除以b 并计算log2,然后计算abs()。

a<-c(2,0,2,3,0,6)
b<-c(0,1,4,6,0,6)
a/b
Inf 0.0 0.5 0.5 NaN 1.0

我想用“2”代替“Inf”,用“0”代替NaN。

【问题讨论】:

  • 听起来你想要一个函数,它将Inf 的所有实例替换为 2,并将NaN 的所有实例替换为 0。对吗?您需要一个函数来对矩阵的每个单元格 c 执行此操作:如果 c=Inf`` then return 2, else if c=NaN` 则返回 0,否则返回 c,对吗?
  • 感谢您的快速回复。对于 NaN,我想用“0”替换矩阵中的所有 NaN,但使用对应位置的 2 个矩阵中的任意一个中的非零值替换 Inf。这里在矩阵“a”中,第一个值为“2”,在矩阵“b”中,第一个值为“0”,当a/b时我得到Inf。所以我想使用“a”中的值“2”来替换 Inf。解释清楚?

标签: r matrix replace nan


【解决方案1】:

你可以这样做:

res <- a/b;
res[is.infinite(res)] <- a[is.infinite(res)];
res[is.nan(res)] <- 0;

虽然,请注意,is.nan 的文档说:

Computations involving ‘NaN’ will return ‘NaN’ or perhaps ‘NA’:
which of those two is not guaranteed and may depend on the R
platform (since compilers may re-order computations).

我得到了NaN

【讨论】:

  • 对于我认为最初的问题也是一个很好的答案(我赞成)。然而,OP Zeng 几乎同时的评论表明,需要更复杂的操作——这可以部分使用您提供的工具构建。
  • 我只是更改了代码以执行上面添加的注释明确需要的操作,而不是总是用 2 替换 Inf,它应该返回 a 的值。我想这就是你所追求的。
  • 非常感谢!这正是我想要的。再次感谢!
【解决方案2】:

在我看来,您只是不想除以 0,而当 b==0 只返回 a 的相应值时。如果是这种情况,则无需处理 InfNaN:只需将 b 中的 0 替换为 1。

b[b==0]<-1
a/b
#[1] 2.0 0.0 0.5 0.5 0.0 1.0

【讨论】:

  • 或者如果OP不想更改原始对象a/replace(b, !b, 1)
猜你喜欢
  • 2016-09-10
  • 1970-01-01
  • 1970-01-01
  • 2014-01-29
  • 1970-01-01
  • 2013-03-24
  • 1970-01-01
  • 1970-01-01
  • 2020-11-20
相关资源
最近更新 更多