[R-es] Expresión en un objeto

Griera-yandex gr|er@ @end|ng |rom y@ndex@com
Mar Ago 15 19:04:08 CEST 2023


Hola, José Luis:

Muchas gracias por responder. No conocía esta función. La reviso.

Pero en el problema que planteaba, la identificación de los valores desconocidos era como un ejemplo, no que realmente los necesitase identificar. El problema que planteaba era si en una una orden, por ejemplo:

V3 <- ((V1 - V2) / (V2)) * 100

se podía substituir una parte de ella por un texto almacenado en un objeto. Es decir, algo así como en el ejemplo:

> V1 <- c (47, 71,  41,  23,  83, 152,  82,   8, 160,  18)
+ V2 <- c (NA, 36,  15,   5,  56,  18,  NA,   5,  NA,   5)
+ V3 <- ((V1 - V2) / (V2)) * 100
+ V3
 [1]        NA  97.22222 173.33333 360.00000  48.21429 744.44444        NA
 [8]  60.00000        NA 260.00000

substituir "(V1 - V2)" por un texto almacenado en un objeto. La solución de R-UCA seria:

> OBJ <- "(V1 - V2)"
+ V3 <- eval(parse(text = paste0 ("(", OBJ, "/ (V2)) * 100")))
+ V3
 [1]        NA  97.22222 173.33333 360.00000  48.21429 744.44444        NA
 [8]  60.00000        NA 260.00000

Gracias por la ayuda y saludos.


On Mon, 14 Aug 2023 15:29:00 +0000 (UTC)
jose luis <pepeceb using yahoo.es> wrote:

>  Hola, no estoy seguro de si es esto lo que te hace falta. ¿conoces la funcion "coalesce"?
> coalesce function - RDocumentation
> 
> 
> | 
> | 
> |  | 
> coalesce function - RDocumentation
> 
> <p>Given a set of vectors, <code>coalesce()</code> finds the first non-missing value at each position. This is i...
>  |
> 
>  |
> 
>  |
> 
> 
> 
> How to implement coalesce efficiently in R
> 
> 
> | 
> | 
> | 
> |  |  |
> 
>  |
> 
>  |
> | 
> |  | 
> How to implement coalesce efficiently in R
> 
> BackgroundSeveral SQL languages (I mostly use postgreSQL) have a function called coalesce which returns the fi...
>  |
> 
>  |
> 
>  |
> 
> 
> 
>     En lunes, 14 de agosto de 2023, 16:38:04 CEST, Griera-yandex <griera using yandex.com> escribió:  
>  
>  Hola:
> 
> Aplicando tu solución al problema original, seria:
> 
> > V1  <- c (47, 71,  41,  23,  83, 152,  82,  8, 160,  18)
> > V2a <- c (NA, 36,  15,  5,  56,  18,  NA,  5,  NA,  5)
> > V2b <- c (37, NA,  15,  NA,  NA,  NA,  90,  NA,  161, NA)
> > ORD <- "(ifelse (is.na (V2a) & ! is.na (V2b), V2b,  V2a))"
> 
> # Sin ORD:
> 
> > V3 <- (((ifelse (is.na (V2a) & ! is.na (V2b), V2b,  V2a)) - V1)/V1)*100
> > V3
>  [1] -21.276596 -49.295775 -63.414634 -78.260870 -32.530120 -88.157895
>  [7]  9.756098 -37.500000  0.625000 -72.222222
> 
> # Substituyendo "(ifelse (is.na (V2a) & ! is.na (V2b), V2b,  V2a))" por ORD:
> 
> > V3 <- eval(parse(text = paste0 ("((", ORD,  "- V1)/V1)*100")))
> > V3 
>  [1] -21.276596 -49.295775 -63.414634 -78.260870 -32.530120 -88.157895
>  [7]  9.756098 -37.500000  0.625000 -72.222222
> 
> # Sin ORD:
> 
> > V4 <-    ifelse (! is.na ((((ifelse (is.na (V2a) & ! is.na (V2b), V2b,  V2a))-V1)/V1)*100), ifelse ((((ifelse (is.na (V2a) & ! is.na (V2b), V2b,  V2a))-V1)/V1)*100 > 0, '1', '0'), NA)
> > V4
>  [1] "0" "0" "0" "0" "0" "0" "1" "0" "1" "0"
> 
> # Substituyendo "(ifelse (is.na (V2a) & ! is.na (V2b), V2b,  V2a))" por ORD:
> 
> > V4 <-    eval(parse(text = paste0 ("ifelse (! is.na (((", ORD, "-V1)/V1)*100), ifelse (((", ORD, "-V1)/V1)*100 > 0, '1', '0'), NA)")))
> > V4
>  [1] "0" "0" "0" "0" "0" "0" "1" "0" "1" "0"
> 
> 
> Mucas gracias y saludos.
> 
> On Mon, 14 Aug 2023 10:14:06 +0200
> Proyecto R-UCA <r-uca using uca.es> wrote:
> 
> > Buenas,
> > 
> > ¿Qué tal esto?
> > 
> > > V1 <- 1
> > > V2a <- 20
> > > V2b <- 200
> > > ORD <- "(ifelse (is.na (V2a) & ! is.na (V2b), V2b,  V2a))"
> > > V3 <- "((ORD - V1)/V1)*100"
> > > V33 <- sub('ORD', ORD, V3)
> > > V33
> > [1] "(((ifelse (is.na (V2a) & ! is.na (V2b), V2b,  V2a)) - V1)/V1)*100"
> > > eval(parse(text = V33))
> > [1] 1900
> > 
> > Un saludo
> > 
> > El vie, 11-08-2023 a las 12:30 +0200, Griera-yandex escribió:
> > > Gracias, Isidro, por la ayuda:
> > > 
> > > On Fri, 11 Aug 2023 09:16:34 +0000
> > > Isidro Hidalgo Arellano <ihidalgo using jccm.es> wrote:
> > > 
> > > > A ver... con que xfunc() esté preparada para tomar un parámetro de tipo "carácter" y evaluarlo, claro que se puede hacer...
> > > > Si el problema lo tienes en evaluar la expresión, la función "eval()" te lo hace.
> > > > Si no te he entendido bien, explícate más 😊
> > > 
> > > Simplemente quería que en la orden:
> > > 
> > > V3 <- ((ORD - V1)/V1)*100
> > > 
> > > ORD lo reconocieses (y lo substituyese), por ejemplo, como "(ifelse (is.na (V2a) & ! is.na (V2b), V2b,
> > > V2a))".
> > > 
> > > Con eval() no parece que funcione:
> > > 
> > > > ORD <- "(ifelse (is.na (V2a) & ! is.na (V2b), V2b,  V2a))"
> > > > V3 <- ((eval (ORD) - V1)/V1)*100
> > > Error in eval(ORD) - V1 : non-numeric argument to binary operator
> > > 
> > > Alguna sugerencia?
> > > 
> > > Gracias y saludos.
> > > 
> > > 
> > > > Saludos
> > > > Isidro
> > > > 
> > > > 
> > > > -----Mensaje original-----
> > > > De: R-help-es <r-help-es-bounces using r-project.org> En nombre de Griera
> > > > Enviado el: jueves, 10 de agosto de 2023 19:36
> > > > Para: r-help-es using r-project.org
> > > > Asunto: [R-es] Expresión en un objeto
> > > > 
> > > > Hola a todos:
> > > > 
> > > > Se me ha planteado un problema que no está ligado a ningún problema concreto. Es más teórico. 
> > > > 
> > > > Supongamos que tenemos tres variables:
> > > > 
> > > > V1  <- c (47, 71,  41,  23,  83, 152,  82,   8, 160,  18)
> > > > V2a <- c (NA, 36,  15,   5,  56,  18,  NA,   5,  NA,   5)
> > > > V2b <- c (37, NA,  15,  NA,  NA,  NA,  90,  NA,  161, NA)
> > > > 
> > > > Supongamos que tengo la expresión (que no puedo asignarlo a ninguna variable):
> > > > 
> > > > (ifelse (is.na (V2a) & ! is.na (V2b), V2b,  V2a))
> > > > 
> > > > Supongamos que tengo que utilizar esta expresión dos o más veces y no puedo utilizar ni un xapply () ni un bucle. Por ejemplo:
> > > > 
> > > > V3 <- (((ifelse (is.na (V2a) & ! is.na (V2b), V2b,  V2a)) - V1)/V1)*100
> > > > V4 <-   ifelse (! is.na ((((ifelse (is.na (V2a) & ! is.na (V2b),
> > > > V2b,  V2a))-V1)/V1)*100), ifelse ((((ifelse (is.na (V2a) & ! is.na (V2b), V2b,  V2a))-V1)/V1)*100 > 0, "1", "0"), NA)
> > > > 
> > > > Hay alguna forma de almacenar la expresión "(ifelse (is.na (V2a) & !
> > > > is.na (V2b), V2b,  V2a))" en un objeto y utilizar el nombre del objeto en las ordenes (por ejemplo, con una hipotética función xfunc
> > > > ()). Por
> > > > ejemplo:
> > > > 
> > > > ORD <- "(ifelse (is.na (V2a) & ! is.na (V2b), V2b,  V2a))"
> > > > V3 <- ((xfunc (ORD) - V1)/V1)*100
> > > > V4 <-   ifelse (! is.na (((xfunc (ORD)-V1)/V1)*100), ifelse
> > > > (((xfunc (ORD)-V1)/V1)*100 > 0, "1", "0"), NA)
> > > > 
> > > > 
> > > > El ejemnplo és absurdo, pero solo lo presento como un hipotético ejercicio.
> > > > 
> > > > Muchas gracias por la ayuda.
> > > > 
> > > > _______________________________________________
> > > > R-help-es mailing list
> > > > R-help-es using r-project.org
> > > > https://urldefense.com/v3/__https://stat.ethz.ch/mailman/listinfo/r-help-es__;!!D9dNQwwGXtA!XN-cky8L5_OX7y2kyLLm27CRefYwg62XypISxc1W0ZPK_yu5yoIEqqRZK27otqN6Gvr0JcGQZ26m$
> > > >  
> > > 
> > > _______________________________________________
> > > R-help-es mailing list
> > > R-help-es using r-project.org
> > > https://urldefense.com/v3/__https://stat.ethz.ch/mailman/listinfo/r-help-es__;!!D9dNQwwGXtA!XN-cky8L5_OX7y2kyLLm27CRefYwg62XypISxc1W0ZPK_yu5yoIEqqRZK27otqN6Gvr0JcGQZ26m$
> > >  
> > 
> > _______________________________________________
> > R-help-es mailing list
> > R-help-es using r-project.org
> > https://stat.ethz.ch/mailman/listinfo/r-help-es
> 
> _______________________________________________
> R-help-es mailing list
> R-help-es using r-project.org
> https://stat.ethz.ch/mailman/listinfo/r-help-es
>   



Más información sobre la lista de distribución R-help-es