Re: [R-es] Expresión en un objeto
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.2 173.3 360.0 48.21429 744.4NA [8] 60.0NA 260.0 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.2 173.3 360.0 48.21429 744.4NA [8] 60.0NA 260.0 Gracias por la ayuda y saludos. On Mon, 14 Aug 2023 15:29:00 + (UTC) jose luis wrote: > Hola, no estoy seguro de si es esto lo que te hace falta. ¿conoces la > funcion "coalesce"? > coalesce function - RDocumentation > > > | > | > | | > coalesce function - RDocumentation > > Given a set of vectors, coalesce() 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 > 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.50 0.625000 -72.22 > > # 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.50 0.625000 -72.22 > > # 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 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 + > > > Isidro Hidalgo Arellano 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 En nombre de Griera > > > > Enviado el: jueves, 10 de agosto de 2023 19:36 > > > > Para: r-help-es@r-project.org > > > > Asunto: [R-es] Expresión en un objeto > > > > > > > > Hola a todos: > > > >
Re: [R-es] Expresión en un objeto
Algo asi: En lunes, 14 de agosto de 2023, 17:29:37 CEST, jose luis via R-help-es escribió: Hola, no estoy seguro de si es esto lo que te hace falta. ¿conoces la funcion "coalesce"? coalesce function - RDocumentation | | | | coalesce function - RDocumentation Given a set of vectors, coalesce() 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 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.50 0.625000 -72.22 # 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.50 0.625000 -72.22 # 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 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 + > > Isidro Hidalgo Arellano 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 En nombre de Griera > > > Enviado el: jueves, 10 de agosto de 2023 19:36 > > > Para: r-help-es@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 <-
Re: [R-es] Expresión en un objeto
Hola, no estoy seguro de si es esto lo que te hace falta. ¿conoces la funcion "coalesce"? coalesce function - RDocumentation | | | | coalesce function - RDocumentation Given a set of vectors, coalesce() 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 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.50 0.625000 -72.22 # 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.50 0.625000 -72.22 # 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 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 + > > Isidro Hidalgo Arellano 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 En nombre de Griera > > > Enviado el: jueves, 10 de agosto de 2023 19:36 > > > Para: r-help-es@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 > > >
Re: [R-es] Expresión en un objeto
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.50 0.625000 -72.22 # 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.50 0.625000 -72.22 # 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 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 + > > Isidro Hidalgo Arellano 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 En nombre de Griera > > > Enviado el: jueves, 10 de agosto de 2023 19:36 > > > Para: r-help-es@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@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@r-project.org > >
Re: [R-es] Expresión en un objeto
Hola: Si, esto está mucho más cerca de lo que quería! Creo que es la solución. Gracias! Lo trabajo! Saludos. On Mon, 14 Aug 2023 10:14:06 +0200 Proyecto R-UCA 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 + > > Isidro Hidalgo Arellano 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 En nombre de Griera > > > Enviado el: jueves, 10 de agosto de 2023 19:36 > > > Para: r-help-es@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@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@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@r-project.org > https://stat.ethz.ch/mailman/listinfo/r-help-es ___ R-help-es mailing list R-help-es@r-project.org https://stat.ethz.ch/mailman/listinfo/r-help-es
Re: [R-es] Expresión en un objeto
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 + > Isidro Hidalgo Arellano 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 En nombre de Griera > > Enviado el: jueves, 10 de agosto de 2023 19:36 > > Para: r-help-es@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@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@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@r-project.org https://stat.ethz.ch/mailman/listinfo/r-help-es
Re: [R-es] Expresión en un objeto
Hola, Manuel: La propuesta es lógica y funciona: > 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) + # Definir una función que encapsula la lógica de la expresión + myFunc <- function (V2a, V2b) { + ifelse(is.na(V2a) & !is.na(V2b), V2b, V2a) + } + # Luego puedes usar esa función donde necesites la expresión + V3 <- ((myFunc(V2a, V2b) - V1)/V1)*100 + V4 <- ifelse(!is.na(((myFunc(V2a, V2b)-V1)/V1)*100), ifelse(((myFunc(V2a, V2b)-V1)/V1)*100 > 0, "1", "0"), NA) Está en la línea de la solución propuesta por Juan Abasolo. Pero no es lo qu buscaba que, por lo que veo, no existe. Gracias a todos por las sugerencias. Saludos. On Sat, 12 Aug 2023 05:07:26 +0200 Manuel Mendoza wrote: > No tuve tiempo de mirarlo, pero, ¿es coherente lo que dice? > > El vie, 11 ago 2023 a las 21:02, Griera-yandex () > escribió: > > > Muchas gracias, Manuel: > > > > Que bueno! No se me había ocurrido lo de GPT! > > > > Lo pruebo. > > > > Saludos. > > > > On Fri, 11 Aug 2023 18:15:18 +0200 > > Manuel Mendoza wrote: > > > > > Esta es la respuesta que te da ChatGPT-4: > > > > > > Entiendo tu pregunta y, aunque no hay una función nativa en R que te > > > permita hacer exactamente lo que estás pidiendo, puedes lograr el mismo > > > resultado utilizando una función. Una función te permitiría encapsular la > > > lógica de la expresión que quieres reutilizar y luego llamar a esa > > función > > > donde sea necesario. > > > > > > He aquí cómo podrías hacerlo: > > > > > > 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) > > > > > > # Definir una función que encapsula la lógica de la expresión > > > myFunc <- function(V2a, V2b) { > > > ifelse(is.na(V2a) & !is.na(V2b), V2b, V2a) > > > } > > > > > > # Luego puedes usar esa función donde necesites la expresión > > > V3 <- ((myFunc(V2a, V2b) - V1)/V1)*100 > > > V4 <- ifelse(!is.na(((myFunc(V2a, V2b)-V1)/V1)*100), > > ifelse(((myFunc(V2a, > > > V2b)-V1)/V1)*100 > 0, "1", "0"), NA) > > > ``` > > > > > > Definir la lógica dentro de una función te brinda la flexibilidad de > > > reutilizar esa lógica en diferentes partes de tu código sin tener que > > > repetir la misma expresión una y otra vez. Esto hace que tu código sea > > más > > > fácil de leer y mantener. > > > > > > > > > > > > El jue, 10 ago 2023 a las 19:36, Griera () escribió: > > > > > > > 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@r-project.org > > > > https://stat.ethz.ch/mailman/listinfo/r-help-es > > > > > > ___ R-help-es mailing list R-help-es@r-project.org https://stat.ethz.ch/mailman/listinfo/r-help-es
Re: [R-es] Expresión en un objeto
No tuve tiempo de mirarlo, pero, ¿es coherente lo que dice? El vie, 11 ago 2023 a las 21:02, Griera-yandex () escribió: > Muchas gracias, Manuel: > > Que bueno! No se me había ocurrido lo de GPT! > > Lo pruebo. > > Saludos. > > On Fri, 11 Aug 2023 18:15:18 +0200 > Manuel Mendoza wrote: > > > Esta es la respuesta que te da ChatGPT-4: > > > > Entiendo tu pregunta y, aunque no hay una función nativa en R que te > > permita hacer exactamente lo que estás pidiendo, puedes lograr el mismo > > resultado utilizando una función. Una función te permitiría encapsular la > > lógica de la expresión que quieres reutilizar y luego llamar a esa > función > > donde sea necesario. > > > > He aquí cómo podrías hacerlo: > > > > 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) > > > > # Definir una función que encapsula la lógica de la expresión > > myFunc <- function(V2a, V2b) { > > ifelse(is.na(V2a) & !is.na(V2b), V2b, V2a) > > } > > > > # Luego puedes usar esa función donde necesites la expresión > > V3 <- ((myFunc(V2a, V2b) - V1)/V1)*100 > > V4 <- ifelse(!is.na(((myFunc(V2a, V2b)-V1)/V1)*100), > ifelse(((myFunc(V2a, > > V2b)-V1)/V1)*100 > 0, "1", "0"), NA) > > ``` > > > > Definir la lógica dentro de una función te brinda la flexibilidad de > > reutilizar esa lógica en diferentes partes de tu código sin tener que > > repetir la misma expresión una y otra vez. Esto hace que tu código sea > más > > fácil de leer y mantener. > > > > > > > > El jue, 10 ago 2023 a las 19:36, Griera () escribió: > > > > > 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@r-project.org > > > https://stat.ethz.ch/mailman/listinfo/r-help-es > > > > [[alternative HTML version deleted]] ___ R-help-es mailing list R-help-es@r-project.org https://stat.ethz.ch/mailman/listinfo/r-help-es
Re: [R-es] Expresión en un objeto
Muchas gracias, Manuel: Que bueno! No se me había ocurrido lo de GPT! Lo pruebo. Saludos. On Fri, 11 Aug 2023 18:15:18 +0200 Manuel Mendoza wrote: > Esta es la respuesta que te da ChatGPT-4: > > Entiendo tu pregunta y, aunque no hay una función nativa en R que te > permita hacer exactamente lo que estás pidiendo, puedes lograr el mismo > resultado utilizando una función. Una función te permitiría encapsular la > lógica de la expresión que quieres reutilizar y luego llamar a esa función > donde sea necesario. > > He aquí cómo podrías hacerlo: > > 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) > > # Definir una función que encapsula la lógica de la expresión > myFunc <- function(V2a, V2b) { > ifelse(is.na(V2a) & !is.na(V2b), V2b, V2a) > } > > # Luego puedes usar esa función donde necesites la expresión > V3 <- ((myFunc(V2a, V2b) - V1)/V1)*100 > V4 <- ifelse(!is.na(((myFunc(V2a, V2b)-V1)/V1)*100), ifelse(((myFunc(V2a, > V2b)-V1)/V1)*100 > 0, "1", "0"), NA) > ``` > > Definir la lógica dentro de una función te brinda la flexibilidad de > reutilizar esa lógica en diferentes partes de tu código sin tener que > repetir la misma expresión una y otra vez. Esto hace que tu código sea más > fácil de leer y mantener. > > > > El jue, 10 ago 2023 a las 19:36, Griera () escribió: > > > 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@r-project.org > > https://stat.ethz.ch/mailman/listinfo/r-help-es > > ___ R-help-es mailing list R-help-es@r-project.org https://stat.ethz.ch/mailman/listinfo/r-help-es
Re: [R-es] Expresión en un objeto
Esta es la respuesta que te da ChatGPT-4: Entiendo tu pregunta y, aunque no hay una función nativa en R que te permita hacer exactamente lo que estás pidiendo, puedes lograr el mismo resultado utilizando una función. Una función te permitiría encapsular la lógica de la expresión que quieres reutilizar y luego llamar a esa función donde sea necesario. He aquí cómo podrías hacerlo: 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) # Definir una función que encapsula la lógica de la expresión myFunc <- function(V2a, V2b) { ifelse(is.na(V2a) & !is.na(V2b), V2b, V2a) } # Luego puedes usar esa función donde necesites la expresión V3 <- ((myFunc(V2a, V2b) - V1)/V1)*100 V4 <- ifelse(!is.na(((myFunc(V2a, V2b)-V1)/V1)*100), ifelse(((myFunc(V2a, V2b)-V1)/V1)*100 > 0, "1", "0"), NA) ``` Definir la lógica dentro de una función te brinda la flexibilidad de reutilizar esa lógica en diferentes partes de tu código sin tener que repetir la misma expresión una y otra vez. Esto hace que tu código sea más fácil de leer y mantener. El jue, 10 ago 2023 a las 19:36, Griera () escribió: > 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@r-project.org > https://stat.ethz.ch/mailman/listinfo/r-help-es > [[alternative HTML version deleted]] ___ R-help-es mailing list R-help-es@r-project.org https://stat.ethz.ch/mailman/listinfo/r-help-es
Re: [R-es] Expresión en un objeto
Gracias, Isidro, por la ayuda: On Fri, 11 Aug 2023 09:16:34 + Isidro Hidalgo Arellano 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 En nombre de Griera > Enviado el: jueves, 10 de agosto de 2023 19:36 > Para: r-help-es@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@r-project.org > https://stat.ethz.ch/mailman/listinfo/r-help-es ___ R-help-es mailing list R-help-es@r-project.org https://stat.ethz.ch/mailman/listinfo/r-help-es
Re: [R-es] Expresión en un objeto
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 Saludos Isidro -Mensaje original- De: R-help-es En nombre de Griera Enviado el: jueves, 10 de agosto de 2023 19:36 Para: r-help-es@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@r-project.org https://stat.ethz.ch/mailman/listinfo/r-help-es ___ R-help-es mailing list R-help-es@r-project.org https://stat.ethz.ch/mailman/listinfo/r-help-es