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.
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 <r-help-es-bounces en r-project.org> En nombre de Griera Enviado el: jueves, 10 de agosto de 2023 19:36 Para: r-help-es en 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 en r-project.org https://stat.ethz.ch/mailman/listinfo/r-help-es
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 (<griera en yandex.com>) 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 en r-project.org > https://stat.ethz.ch/mailman/listinfo/r-help-es >[[alternative HTML version deleted]]