Hola, Carlos: Gracias, funciona también a la perfección y muy ingeniosa la solución. Disculpa si no te he respondido antes, pero hasta ahora no he podido privarlo. Gracias por la ayuda y 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