Hola:
Muchas gracias por responder. Lo pruebo.
Saludos.
On Fri, 27 Jan 2023 01:40:48 +0100
Carlos Ortega <cof en qualityexcellence.es> wrote:
> Hola,
>
> Otra alternativa...
>
> #--------------------
> > library(data.table)
> > library(tidytable)
> > library(stringi)
> >
> > 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))
> > df
> V1a V1b V2a V2b
> 1 1 0 1 1
> 2 1 1 0 1
> 3 0 0 0 0
> 4 1 0 1 0
> 5 0 1 0 0
> 6 0 0 1 0
> 7 1 0 0 0
> 8 1 1 1 0
> 9 0 0 0 0
> 10 0 1 1 1
> > > #--- Función compara parejas de columnas comienzan por mismas 2
letras.
> > *colcompare <- function(df)* {
> +
> + nam_val <- names(df) %>% stri_sub(from = 1, to = 2) %>%
unique()
> + res_df <- data.table()
> + for (i in 1:length(nam_val)) {
> + cols_tmp <- nam_val[i]
> + df_tmp <- df %>% select.(starts_with(cols_tmp)) %>%
> + rename.( a = 1) %>%
> + rename.( b = 2) %>%
> + mutate.( c = if_else.( a == 1 | b == 1, 1, 0)) %>%
> + select.(c) %>%
> + as.data.table()
> + names(df_tmp) <- paste0(cols_tmp, "c")
> + res_df <- cbind(res_df, df_tmp)
> + }
> + return(res_df)
> + }
> >
> > #--- Sobre df creado
> > *resultado <- colcompare(df)*
> > resultado
> V1c V2c
> <num> <num>
> 1: 0 1
> 2: 1 0
> 3: 1 1
> 4: 1 1
> 5: 1 1
> 6: 1 1
> 7: 1 1
> 8: 0 0
> 9: 1 1
> 10: 0 1
> #--------------------
>
>
> Gracias,
> Carlos Ortega
> www.qualityexcellence.es
>
> El jue, 26 ene 2023 a las 19:55, Griera-yandex (<griera en
yandex.com>)
> escribió:
>
> > 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
> > > >
> >
> > _______________________________________________
> > R-help-es mailing list
> > R-help-es en r-project.org
> > https://stat.ethz.ch/mailman/listinfo/r-help-es
> >
>
>
> --
> Saludos,
> Carlos Ortega
> www.qualityexcellence.es