2015-09-05 37 views
0

我有两个大的矩阵,100列和10,000行。我试图通过ba并计算log2,然后abs()。如何用2个矩阵值中的1个替换NaN和Inf?

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。

+0

这听起来像是你想要一个函数,它将用'2'代替'Inf'的所有实例,并且将用'0'代替'NaN'的所有实例。这是正确的吗?你需要一个函数来处理矩阵的每个单元格'c':如果'c = Inf''则返回2,否则如果'c = NaN'则返回0,否则返回'c',对吧? – Mars

+0

感谢您的快速响应。对于NaN,我想用“0”替换矩阵中的所有NaN,但是使用相应位置的2个矩阵中的任意一个矩阵中的非零值替换Inf。这里在矩阵“a”中,第一个值是“2”,在矩阵“b”中,第一个值是“0”,当a/b时我得到了Inf。所以我想用“a”中的“2”代替Inf。解释清楚吗? –

回答

2

你可以这样做:

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虽然。

+0

这是一个很好的答案(我upvoted),我认为原来的问题也是。然而,OP曾在几乎同一时间发表的评论表明,需要更复杂的操作 - 这可以部分由您提供的工具构建。 – Mars

+0

我只是改变了代码,以做上面添加的评论明确的是想要的,而不是总是用2代替'Inf',它应该返回a的值。我认为这是你的追求。 – jowalski

+0

非常感谢!这正是我想要的。再次感谢! –

2

在我看来,你只是不想被0除,而当b==0只是返回相应的值a。如果是这样的话,不需要在InfNaN上工作:只需用b替换0就可以了。

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

或者如果OP不想改变原始对象'a/replace(b,!b,1)' – akrun

相关问题