#r
#r
Вопрос:
У меня есть 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) вместо all -Inf в результатах. как я могу сделать это эффективным способом в R? Это означает, что я хочу получить конечный результат следующим образом:
(-4.670774,7.389056 , 20.085537, -93.815009,148.413159)
Комментарии:
1. Значение
e^INF
, как и ожидалось, равно бесконечности. Кажется, что вы хотите такого поведения, как взятиеe^-INF
, не так ли? Если это так, то вашу формулу необходимо изменить.
Ответ №1:
Вы имеете в виду что-то вроде приведенного ниже?
> 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
Комментарии:
1.
replace
Идея может быть перенастроена наifelse
—ifelse(is.infinite(x$z), exp(x$w), exp(x$w) - exp(x$z))
2. @thelatemail Да, спасибо! Добавлен
ifelse
подход, и мы также можем обойтись безifelsef
илиreplace
Ответ №2:
Я предлагаю вам попробовать case_when()
функцию from library(dplyr)
, чтобы указать условия для 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