José Luis Cañadas Reche
2014-Apr-11 12:08 UTC
[R-es] crear variable en base a nombre de columnas que tienen un 1
Carlos, en principio si sería algo así, sólo que en vez de quedarme con todas las columnas var1 a var4 tuviera sólo 3, ya que en mis datos no hay ningún caso que tenga el valor 1 en más de 3 variables.. Había llegado a una solución (mucho menos elegante que usando reshape), que implicaba un for sobre las filas. Jorge, creo que tu solución me vale. Muchas gracias a los dos.. Saludos El 11/04/14 13:49, Carlos J. Gil Bellosta escribió:> ¿Algo así? > > var1 <- c(rep(0,3),rep(1,2)) > var2 <- c(rep(1,2),0,0,1) > var3 <- c(rep(1,2),rep(0,3)) > var4 <- c(rep(1,2),rep(0,3)) > datos <- data.frame(fila=1:5,var1, var2, var3, var4) > > library(reshape2) > > tmp <- melt(datos, id.vars="fila") > > tmp$uno <- as.character(tmp$variable) > tmp$uno[tmp$value != 1] <- "0" > > res <- dcast(tmp, fila ~ variable, value.var = "value") > res <- dcast(tmp, fila ~ variable, value.var = "uno") > > Igual simplemente quieres trabajar con los datos en columna. > > Un saludo, > > Carlos J. Gil Bellosta > http://www.datanalytics.com > > El día 11 de abril de 2014, 12:54, José Luis Cañadas Reche > <canadasreche en gmail.com> escribió: >> Buenos días. >> >> Hoy ando un poco (o bastante) espeso y no doy con la tecla de una cosa que >> seguro que es muy simple.. >> >> Pongo un ejemplo. >> >> var1 <- c(rep(0,3),rep(1,2)) >> var2 <- c(rep(1,2),0,0,1) >> var3 <- c(rep(1,2),rep(0,3)) >> var4 <- c(rep(1,2),rep(0,3)) >> datos <- data.frame(fila=1:5,var1, var2, var3, var4) >> >> datos >> datos >> fila var1 var2 var3 var4 >> 1 1 0 1 1 1 >> 2 2 0 1 1 1 >> 3 3 0 0 0 0 >> 4 4 1 0 0 0 >> 5 5 1 1 0 0 >> >> El caso es que quiero crear 3 variables nuevas p1, p2 y p3 de forma que p1 >> recoja el nombre de la primera variables dónde hay un 1 . >> >> Se quedaría >> >> datos >> fila var1 var2 var3 var4 p1 p2 p3 >> 1 1 0 1 1 1 var2 var3 var4 >> 2 2 0 1 1 1 var2 var3 var4 >> 3 3 0 0 0 0 0 0 0 >> 4 4 1 0 0 0 var1 0 0 >> 5 5 1 1 0 0 var1 var2 0 >> >> >> El caso es que no puedo haber más de 3 respuestas. En mis datos reales tengo >> más de 600 variables de tipo 0,1 , pero nadie ha contestado más de 3 >> respuestas. >> ¿cómo podría asignar a p1, p2 y p3 el nombre de las variables dónde hay un >> 1? >> >> alguna idea? >> >> Saludos. >> >> _______________________________________________ >> R-help-es mailing list >> R-help-es en r-project.org >> https://stat.ethz.ch/mailman/listinfo/r-help-es
Jorge I Velez
2014-Apr-11 13:58 UTC
[R-es] crear variable en base a nombre de columnas que tienen un 1
José Luis, Para obtener los mismos resultados del correo que enviaste describiendo tu problema, debes modificar el código que te envié, así: d <- datos[, -1] p <- sapply(1:ncol(d), function(i){ x <- d[, i] x[x == 0] <- 0 x[x == 1] <- colnames(d)[i] x }) cbind(datos, p) Saludos, Jorge.- 2014-04-11 22:08 GMT+10:00 José Luis Cañadas Reche <canadasreche@gmail.com>:> Carlos, en principio si sería algo así, sólo que en vez de quedarme con > todas las columnas var1 a var4 tuviera sólo 3, ya que en mis datos no hay > ningún caso que tenga el valor 1 en más de 3 variables.. > > Había llegado a una solución (mucho menos elegante que usando reshape), > que implicaba un for sobre las filas. > > Jorge, creo que tu solución me vale. > > Muchas gracias a los dos.. > > Saludos > > > > El 11/04/14 13:49, Carlos J. Gil Bellosta escribió: > > ¿Algo así? >> >> var1 <- c(rep(0,3),rep(1,2)) >> var2 <- c(rep(1,2),0,0,1) >> var3 <- c(rep(1,2),rep(0,3)) >> var4 <- c(rep(1,2),rep(0,3)) >> datos <- data.frame(fila=1:5,var1, var2, var3, var4) >> >> library(reshape2) >> >> tmp <- melt(datos, id.vars="fila") >> >> tmp$uno <- as.character(tmp$variable) >> tmp$uno[tmp$value != 1] <- "0" >> >> res <- dcast(tmp, fila ~ variable, value.var = "value") >> res <- dcast(tmp, fila ~ variable, value.var = "uno") >> >> Igual simplemente quieres trabajar con los datos en columna. >> >> Un saludo, >> >> Carlos J. Gil Bellosta >> http://www.datanalytics.com >> >> El día 11 de abril de 2014, 12:54, José Luis Cañadas Reche >> <canadasreche@gmail.com> escribió: >> >>> Buenos días. >>> >>> Hoy ando un poco (o bastante) espeso y no doy con la tecla de una cosa >>> que >>> seguro que es muy simple.. >>> >>> Pongo un ejemplo. >>> >>> var1 <- c(rep(0,3),rep(1,2)) >>> var2 <- c(rep(1,2),0,0,1) >>> var3 <- c(rep(1,2),rep(0,3)) >>> var4 <- c(rep(1,2),rep(0,3)) >>> datos <- data.frame(fila=1:5,var1, var2, var3, var4) >>> >>> datos >>> datos >>> fila var1 var2 var3 var4 >>> 1 1 0 1 1 1 >>> 2 2 0 1 1 1 >>> 3 3 0 0 0 0 >>> 4 4 1 0 0 0 >>> 5 5 1 1 0 0 >>> >>> El caso es que quiero crear 3 variables nuevas p1, p2 y p3 de forma que >>> p1 >>> recoja el nombre de la primera variables dónde hay un 1 . >>> >>> Se quedaría >>> >>> datos >>> fila var1 var2 var3 var4 p1 p2 p3 >>> 1 1 0 1 1 1 var2 var3 var4 >>> 2 2 0 1 1 1 var2 var3 var4 >>> 3 3 0 0 0 0 0 0 0 >>> 4 4 1 0 0 0 var1 0 0 >>> 5 5 1 1 0 0 var1 var2 0 >>> >>> >>> El caso es que no puedo haber más de 3 respuestas. En mis datos reales >>> tengo >>> más de 600 variables de tipo 0,1 , pero nadie ha contestado más de 3 >>> respuestas. >>> ¿cómo podría asignar a p1, p2 y p3 el nombre de las variables dónde hay >>> un >>> 1? >>> >>> alguna idea? >>> >>> Saludos. >>> >>> _______________________________________________ >>> R-help-es mailing list >>> R-help-es@r-project.org >>> https://stat.ethz.ch/mailman/listinfo/r-help-es >>> >> >[[alternative HTML version deleted]]
Jose Luis Cañadas Reche
2014-Apr-11 18:23 UTC
[R-es] crear variable en base a nombre de columnas que tienen un 1
Ok. Desde luego, es un privilegio formar parte de esta lista. Se encuentra ayuda enseguida (¿alguien echa de menos un soporte comercial?). Y lo dicho, hoy estaba espeso y me habéis sacado de un apuro.. Espero devolver el favor a la lista.. El 11/04/14 15:58, Jorge I Velez escribió:> José Luis, > > Para obtener los mismos resultados del correo que enviaste > describiendo tu problema, debes modificar el código que te envié, así: > > d <- datos[, -1] > p <- sapply(1:ncol(d), function(i){ > x <- d[, i] > x[x == 0] <- 0 > x[x == 1] <- colnames(d)[i] > x > }) > cbind(datos, p) > > Saludos, > Jorge.- > > > > > > 2014-04-11 22:08 GMT+10:00 José Luis Cañadas Reche > <canadasreche@gmail.com <mailto:canadasreche@gmail.com>>: > > Carlos, en principio si sería algo así, sólo que en vez de > quedarme con todas las columnas var1 a var4 tuviera sólo 3, ya que > en mis datos no hay ningún caso que tenga el valor 1 en más de 3 > variables.. > > Había llegado a una solución (mucho menos elegante que usando > reshape), que implicaba un for sobre las filas. > > Jorge, creo que tu solución me vale. > > Muchas gracias a los dos.. > > Saludos > > > > El 11/04/14 13:49, Carlos J. Gil Bellosta escribió: > > ¿Algo así? > > var1 <- c(rep(0,3),rep(1,2)) > var2 <- c(rep(1,2),0,0,1) > var3 <- c(rep(1,2),rep(0,3)) > var4 <- c(rep(1,2),rep(0,3)) > datos <- data.frame(fila=1:5,var1, var2, var3, var4) > > library(reshape2) > > tmp <- melt(datos, id.vars="fila") > > tmp$uno <- as.character(tmp$variable) > tmp$uno[tmp$value != 1] <- "0" > > res <- dcast(tmp, fila ~ variable, value.var = "value") > res <- dcast(tmp, fila ~ variable, value.var = "uno") > > Igual simplemente quieres trabajar con los datos en columna. > > Un saludo, > > Carlos J. Gil Bellosta > http://www.datanalytics.com > > El día 11 de abril de 2014, 12:54, José Luis Cañadas Reche > <canadasreche@gmail.com <mailto:canadasreche@gmail.com>> escribió: > > Buenos días. > > Hoy ando un poco (o bastante) espeso y no doy con la tecla > de una cosa que > seguro que es muy simple.. > > Pongo un ejemplo. > > var1 <- c(rep(0,3),rep(1,2)) > var2 <- c(rep(1,2),0,0,1) > var3 <- c(rep(1,2),rep(0,3)) > var4 <- c(rep(1,2),rep(0,3)) > datos <- data.frame(fila=1:5,var1, var2, var3, var4) > > datos > datos > fila var1 var2 var3 var4 > 1 1 0 1 1 1 > 2 2 0 1 1 1 > 3 3 0 0 0 0 > 4 4 1 0 0 0 > 5 5 1 1 0 0 > > El caso es que quiero crear 3 variables nuevas p1, p2 y p3 > de forma que p1 > recoja el nombre de la primera variables dónde hay un 1 . > > Se quedaría > > datos > fila var1 var2 var3 var4 p1 p2 p3 > 1 1 0 1 1 1 var2 var3 var4 > 2 2 0 1 1 1 var2 var3 var4 > 3 3 0 0 0 0 0 0 0 > 4 4 1 0 0 0 var1 0 0 > 5 5 1 1 0 0 var1 var2 0 > > > El caso es que no puedo haber más de 3 respuestas. En mis > datos reales tengo > más de 600 variables de tipo 0,1 , pero nadie ha > contestado más de 3 > respuestas. > ¿cómo podría asignar a p1, p2 y p3 el nombre de las > variables dónde hay un > 1? > > alguna idea? > > Saludos. > > _______________________________________________ > R-help-es mailing list > R-help-es@r-project.org <mailto:R-help-es@r-project.org> > https://stat.ethz.ch/mailman/listinfo/r-help-es > > >[[alternative HTML version deleted]]