Hola esta es una solución library(data.table) library(stringr) dt <- data.table( V1a = sample(c("1","0"), 10, TRUE) , V1b = sample(c("1","0"), 10, TRUE) , V2a = sample(c("1","0"), 10, TRUE) , V2b = sample(c("1","0"), 10, TRUE) , V3a = sample(c("1","0"), 10, TRUE) , V3b = sample(c("1","0"), 10, TRUE) , V4a = sample(c("1","0"), 10, TRUE) , V4b = sample(c("1","0"), 10, TRUE)) dt[,":="(seq=.I)] setcolorder(dt,"seq") dt1 <- melt(dt,id.vars=1,measure.vars=2:ncol(dt),variable.name="vrb", value.name="vl") dt1[,":="(vrb_nm=str_sub(vrb,end=2),vrb_tp=str_sub(vrb,start=-1))] dt2 <- dcast(dt1,seq+vrb_nm~vrb_tp,fun.aggregate=\(x) paste0(x,collapse="|"),value.var="vl") dt2[,":="(c=fifelse(a=="1"|b=="1","1","0"))] dt3 <-dcast(dt2,seq~vrb_nm,fun.aggregate=\(x) paste0(x,collapse="|"),value.var="c") setnames(dt3,paste0(colnames(dt3),"c")) dt <- dt[dt3,on=.(seq=seqc)] Te crea un grupo de variables tipo c que es la lógica que necesitas .. pero le puedes reemplazar por el nombre de "a", qué es lo que muestras en el ejemplo Saludos El jue, 26 ene 2023 a la(s) 06:02, <r-help-es-request en r-project.org> escribió:> Envíe los mensajes para la lista R-help-es a > r-help-es en r-project.org > > Para subscribirse o anular su subscripción a través de la WEB > https://stat.ethz.ch/mailman/listinfo/r-help-es > > O por correo electrónico, enviando un mensaje con el texto "help" en > el asunto (subject) o en el cuerpo a: > r-help-es-request en r-project.org > > Puede contactar con el responsable de la lista escribiendo a: > r-help-es-owner en r-project.org > > Si responde a algún contenido de este mensaje, por favor, edite la > linea del asunto (subject) para que el texto sea mas especifico que: > "Re: Contents of R-help-es digest...". Además, por favor, incluya en > la respuesta sólo aquellas partes del mensaje a las que está > respondiendo. > Asuntos del día: > > 1. Modificar una serie columnas de un dataframe (Griera) > > > ---------- Forwarded message ---------- > From: Griera <griera en yandex.com> > To: r-help-es en r-project.org, griera en yandex.com > Cc: > Bcc: > Date: Thu, 26 Jan 2023 09:46:57 +0100 > Subject: [R-es] Modificar una serie columnas de un dataframe > Hola: > > Lo vuelvo a enviar para ver si tengo más suerte: > > Tengo una tabla con pares de variables (V1a, V1b, V2a, V2b, ...) similar a > esta: > > df <- data.frame( V1a = sample(c("1","0"), 10, TRUE) > , V1b = sample(c("1","0"), 10, TRUE) > , V2a = sample(c("1","0"), 10, TRUE) > , V2b = sample(c("1","0"), 10, TRUE)) > > V1a V1b V2a V2b > 1 0 1 0 0 > 2 0 0 1 0 > 3 0 1 0 0 > ... > > y quiero que V1a valga "1" si V1a o V1b valen 1, V2a valga "1" si V2a o > V2b valen 1 y así sucesivamente. Lo hago mediante un transform con una > línia para cada pareja de variables: > > df <- transform (df > , V1a = ifelse (V1a == "1" | V1b == "1", "1, "0") > , V2a = ifelse (V2a == "1" | V2b == "1", "1, "0")) > > ) > ¿Habria forma de hacerlo (¿con un función?) de manera que no tenga que > escribir una línia para cada par de variables? > > Muchas gracias a todos y saludos. > > > _______________________________________________ > 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]]
Muchas gracias por responder! Después lo hago. Saludos. On Thu, 26 Jan 2023 09:33:31 -0500 patricio fuenmayor <patricio.fuenmayor en gmail.com> wrote:> Hola esta es una solución > > library(data.table) > library(stringr) > > > dt <- data.table( V1a = sample(c("1","0"), 10, TRUE) > , V1b = sample(c("1","0"), 10, TRUE) > , V2a = sample(c("1","0"), 10, TRUE) > , V2b = sample(c("1","0"), 10, TRUE) > , V3a = sample(c("1","0"), 10, TRUE) > , V3b = sample(c("1","0"), 10, TRUE) > , V4a = sample(c("1","0"), 10, TRUE) > , V4b = sample(c("1","0"), 10, TRUE)) > dt[,":="(seq=.I)] > setcolorder(dt,"seq") > > dt1 <- melt(dt,id.vars=1,measure.vars=2:ncol(dt),variable.name="vrb", > value.name="vl") > dt1[,":="(vrb_nm=str_sub(vrb,end=2),vrb_tp=str_sub(vrb,start=-1))] > dt2 <- dcast(dt1,seq+vrb_nm~vrb_tp,fun.aggregate=\(x) > paste0(x,collapse="|"),value.var="vl") > dt2[,":="(c=fifelse(a=="1"|b=="1","1","0"))] > dt3 <-dcast(dt2,seq~vrb_nm,fun.aggregate=\(x) > paste0(x,collapse="|"),value.var="c") > setnames(dt3,paste0(colnames(dt3),"c")) > dt <- dt[dt3,on=.(seq=seqc)] > > Te crea un grupo de variables tipo c que es la lógica que necesitas .. pero > le puedes reemplazar por el nombre de "a", qué es lo que muestras en el > ejemplo > > > Saludos > > > > > El jue, 26 ene 2023 a la(s) 06:02, <r-help-es-request en r-project.org> > escribió: > > > Envíe los mensajes para la lista R-help-es a > > r-help-es en r-project.org > > > > Para subscribirse o anular su subscripción a través de la WEB > > https://stat.ethz.ch/mailman/listinfo/r-help-es > > > > O por correo electrónico, enviando un mensaje con el texto "help" en > > el asunto (subject) o en el cuerpo a: > > r-help-es-request en r-project.org > > > > Puede contactar con el responsable de la lista escribiendo a: > > r-help-es-owner en r-project.org > > > > Si responde a algún contenido de este mensaje, por favor, edite la > > linea del asunto (subject) para que el texto sea mas especifico que: > > "Re: Contents of R-help-es digest...". Además, por favor, incluya en > > la respuesta sólo aquellas partes del mensaje a las que está > > respondiendo. > > Asuntos del día: > > > > 1. Modificar una serie columnas de un dataframe (Griera) > > > > > > ---------- Forwarded message ---------- > > From: Griera <griera en yandex.com> > > To: r-help-es en r-project.org, griera en yandex.com > > Cc: > > Bcc: > > Date: Thu, 26 Jan 2023 09:46:57 +0100 > > Subject: [R-es] Modificar una serie columnas de un dataframe > > Hola: > > > > Lo vuelvo a enviar para ver si tengo más suerte: > > > > Tengo una tabla con pares de variables (V1a, V1b, V2a, V2b, ...) similar a > > esta: > > > > df <- data.frame( V1a = sample(c("1","0"), 10, TRUE) > > , V1b = sample(c("1","0"), 10, TRUE) > > , V2a = sample(c("1","0"), 10, TRUE) > > , V2b = sample(c("1","0"), 10, TRUE)) > > > > V1a V1b V2a V2b > > 1 0 1 0 0 > > 2 0 0 1 0 > > 3 0 1 0 0 > > ... > > > > y quiero que V1a valga "1" si V1a o V1b valen 1, V2a valga "1" si V2a o > > V2b valen 1 y así sucesivamente. Lo hago mediante un transform con una > > línia para cada pareja de variables: > > > > df <- transform (df > > , V1a = ifelse (V1a == "1" | V1b == "1", "1, "0") > > , V2a = ifelse (V2a == "1" | V2b == "1", "1, "0")) > > > > ) > > ¿Habria forma de hacerlo (¿con un función?) de manera que no tenga que > > escribir una línia para cada par de variables? > > > > Muchas gracias a todos y saludos. > > > > > > _______________________________________________ > > R-help-es mailing list > > R-help-es en r-project.org > > https://stat.ethz.ch/mailman/listinfo/r-help-es > >
Hola: Funciona a la perfección. Y los nombres de las nuevas variables tipo "V1c" "V2c"... ya me está bien. Gracias por habertelo currado tanto! Me has ahorrado copiar, pegar y modificar un monton de linias. Y no tenia conciencia de que podia ser tan complicado. Gracias por la ayuda. Saludos. On Thu, 26 Jan 2023 09:33:31 -0500 patricio fuenmayor <patricio.fuenmayor en gmail.com> wrote:> Hola esta es una solución > > library(data.table) > library(stringr) > > > dt <- data.table( V1a = sample(c("1","0"), 10, TRUE) > , V1b = sample(c("1","0"), 10, TRUE) > , V2a = sample(c("1","0"), 10, TRUE) > , V2b = sample(c("1","0"), 10, TRUE) > , V3a = sample(c("1","0"), 10, TRUE) > , V3b = sample(c("1","0"), 10, TRUE) > , V4a = sample(c("1","0"), 10, TRUE) > , V4b = sample(c("1","0"), 10, TRUE)) > dt[,":="(seq=.I)] > setcolorder(dt,"seq") > > dt1 <- melt(dt,id.vars=1,measure.vars=2:ncol(dt),variable.name="vrb", > value.name="vl") > dt1[,":="(vrb_nm=str_sub(vrb,end=2),vrb_tp=str_sub(vrb,start=-1))] > dt2 <- dcast(dt1,seq+vrb_nm~vrb_tp,fun.aggregate=\(x) > paste0(x,collapse="|"),value.var="vl") > dt2[,":="(c=fifelse(a=="1"|b=="1","1","0"))] > dt3 <-dcast(dt2,seq~vrb_nm,fun.aggregate=\(x) > paste0(x,collapse="|"),value.var="c") > setnames(dt3,paste0(colnames(dt3),"c")) > dt <- dt[dt3,on=.(seq=seqc)] > > Te crea un grupo de variables tipo c que es la lógica que necesitas .. pero > le puedes reemplazar por el nombre de "a", qué es lo que muestras en el > ejemplo > > > Saludos > > > > > El jue, 26 ene 2023 a la(s) 06:02, <r-help-es-request en r-project.org> > escribió: > > > Envíe los mensajes para la lista R-help-es a > > r-help-es en r-project.org > > > > Para subscribirse o anular su subscripción a través de la WEB > > https://stat.ethz.ch/mailman/listinfo/r-help-es > > > > O por correo electrónico, enviando un mensaje con el texto "help" en > > el asunto (subject) o en el cuerpo a: > > r-help-es-request en r-project.org > > > > Puede contactar con el responsable de la lista escribiendo a: > > r-help-es-owner en r-project.org > > > > Si responde a algún contenido de este mensaje, por favor, edite la > > linea del asunto (subject) para que el texto sea mas especifico que: > > "Re: Contents of R-help-es digest...". Además, por favor, incluya en > > la respuesta sólo aquellas partes del mensaje a las que está > > respondiendo. > > Asuntos del día: > > > > 1. Modificar una serie columnas de un dataframe (Griera) > > > > > > ---------- Forwarded message ---------- > > From: Griera <griera en yandex.com> > > To: r-help-es en r-project.org, griera en yandex.com > > Cc: > > Bcc: > > Date: Thu, 26 Jan 2023 09:46:57 +0100 > > Subject: [R-es] Modificar una serie columnas de un dataframe > > Hola: > > > > Lo vuelvo a enviar para ver si tengo más suerte: > > > > Tengo una tabla con pares de variables (V1a, V1b, V2a, V2b, ...) similar a > > esta: > > > > df <- data.frame( V1a = sample(c("1","0"), 10, TRUE) > > , V1b = sample(c("1","0"), 10, TRUE) > > , V2a = sample(c("1","0"), 10, TRUE) > > , V2b = sample(c("1","0"), 10, TRUE)) > > > > V1a V1b V2a V2b > > 1 0 1 0 0 > > 2 0 0 1 0 > > 3 0 1 0 0 > > ... > > > > y quiero que V1a valga "1" si V1a o V1b valen 1, V2a valga "1" si V2a o > > V2b valen 1 y así sucesivamente. Lo hago mediante un transform con una > > línia para cada pareja de variables: > > > > df <- transform (df > > , V1a = ifelse (V1a == "1" | V1b == "1", "1, "0") > > , V2a = ifelse (V2a == "1" | V2b == "1", "1, "0")) > > > > ) > > ¿Habria forma de hacerlo (¿con un función?) de manera que no tenga que > > escribir una línia para cada par de variables? > > > > Muchas gracias a todos y saludos. > > > > > > _______________________________________________ > > R-help-es mailing list > > R-help-es en r-project.org > > https://stat.ethz.ch/mailman/listinfo/r-help-es > >