Замена в фрейме данных приводит к R

#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