我有两个大的矩阵,100列和10,000行。我试图通过b
除a
并计算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。
我有两个大的矩阵,100列和10,000行。我试图通过b
除a
并计算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。
你可以这样做:
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除,而当b==0
只是返回相应的值a
。如果是这样的话,不需要在Inf
和NaN
上工作:只需用b
替换0就可以了。
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)' – akrun
这听起来像是你想要一个函数,它将用'2'代替'Inf'的所有实例,并且将用'0'代替'NaN'的所有实例。这是正确的吗?你需要一个函数来处理矩阵的每个单元格'c':如果'c = Inf''则返回2,否则如果'c = NaN'则返回0,否则返回'c',对吧? – Mars
感谢您的快速响应。对于NaN,我想用“0”替换矩阵中的所有NaN,但是使用相应位置的2个矩阵中的任意一个矩阵中的非零值替换Inf。这里在矩阵“a”中,第一个值是“2”,在矩阵“b”中,第一个值是“0”,当a/b时我得到了Inf。所以我想用“a”中的“2”代替Inf。解释清楚吗? –