我有一个data.frame,如
x= data.frame("w"=c(1,2,3,4,5),"z"=c(2,Inf,Inf,5, Inf))
,我想计算以下公式:
exp(x$w) - exp(x$z)
> exp(x$w) - exp(x$z)
[1] -4.670774 -Inf -Inf -93.815009 -Inf
我的目标是替换exp(x$w)而不是所有-Inf结果。如何在R中有效地做到这一点?这意味着我想要的最终结果如下:(-4.670774,7.389056, 20.085537, -93.815009,148.413159)
你的意思是像下面这样吗?
> do.call("-", Map(function(v) exp(replace(v, is.infinite(v), -Inf)), x))
[1] -4.670774 7.389056 20.085537 -93.815009 148.413159
或
> do.call("-", replace(exp(x), is.infinite(as.matrix(x)), 0))
[1] -4.670774 7.389056 20.085537 -93.815009 148.413159
或
> with(
+ x,
+ exp(w) - exp(ifelse(is.infinite(z), -Inf, z))
+ )
[1] -4.670774 7.389056 20.085537 -93.815009 148.413159
或
> with(
+ x,
+ exp(w) - exp(z * (1 - 2 * is.infinite(z)))
+ )
[1] -4.670774 7.389056 20.085537 -93.815009 148.413159
我建议您可以尝试library(dplyr)
中的case_when()
函数来说明z
的条件:
library(dplyr)
x %>%
dplyr::mutate(z, z= case_when(z == Inf~ exp(w),
z != Inf ~ exp(z)))
控制台输出:
# w z
#1 1 7.389056
#2 2 7.389056
#3 3 20.085537
#4 4 148.413159
#5 5 148.413159