José Luis Cañadas Reche
2014-Apr-11 10:54 UTC
[R-es] crear variable en base a nombre de columnas que tienen un 1
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.
Carlos J. Gil Bellosta
2014-Apr-11 11:49 UTC
[R-es] crear variable en base a nombre de columnas que tienen un 1
¿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 11:59 UTC
[R-es] crear variable en base a nombre de columnas que tienen un 1
Hola José Luis, Gracias por el ejemplo. Intenta lo siguiente: d <- datos[, -1] p <- t(apply(d, 1, function(x){ r <- colnames(d)[x == 1][1:ncol(d)] r[is.na(r)] <- 0 r })) cbind(d, p) #var1 var2 var3 var4 1 2 3 4 #1 0 1 1 1 var2 var3 var4 0 #2 0 1 1 1 var2 var3 var4 0 #3 0 0 0 0 0 0 0 0 #4 1 0 0 0 var1 0 0 0 #5 1 1 0 0 var1 var2 0 0 Saludos, Jorge.- 2014-04-11 20:54 GMT+10:00 José Luis Cañadas Reche <canadasreche@gmail.com>:> 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]]
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
Marcelino de la Cruz
2014-Apr-11 12:24 UTC
[R-es] crear variable en base a nombre de columnas que tienen un 1
Otra versión, en una sola línea: > datos=cbind(datos,t(apply(datos,1, function(x) {v=names(datos)[which(x[-1]==1)+1];return(c(v, rep(0, 3-length(v))))}))) > datos fila var1 var2 var3 var4 1 2 3 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 11/04/2014 13:59, Jorge I Velez escribió:> Hola José Luis, > > Gracias por el ejemplo. Intenta lo siguiente: > > d <- datos[, -1] > p <- t(apply(d, 1, function(x){ > r <- colnames(d)[x == 1][1:ncol(d)] > r[is.na(r)] <- 0 > r > })) > cbind(d, p) > #var1 var2 var3 var4 1 2 3 4 > #1 0 1 1 1 var2 var3 var4 0 > #2 0 1 1 1 var2 var3 var4 0 > #3 0 0 0 0 0 0 0 0 > #4 1 0 0 0 var1 0 0 0 > #5 1 1 0 0 var1 var2 0 0 > > Saludos, > Jorge.- > > > > 2014-04-11 20:54 GMT+10:00 José Luis Cañadas Reche <canadasreche en gmail.com>: > >> 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 >> > > [[alternative HTML version deleted]] > > > > _______________________________________________ > R-help-es mailing list > R-help-es en r-project.org > https://stat.ethz.ch/mailman/listinfo/r-help-es >
rubenfcasal
2014-Apr-15 12:44 UTC
[R-es] crear variable en base a nombre de columnas que tienen un 1
Hola a todos, Aprovecho para hacer también una consulta (no es importante ni corre prisa, más bien es curiosidad)... El problema que comentas tiene el aspecto de un caso de respuestas múltiples, si es así mejor tratarlo de esta forma. Yo para estos casos recurría al SPSS, ¿sabéis o recomendaríais algún paquete de R para hacer esto? Buscando un poco encontré el paquete 'MRCV' pero no me convenció mucho. Un saludo, Ruben FC. El 11/04/2014 12:54, José Luis Cañadas Reche 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 >
José Luis Cañadas Reche
2014-Apr-16 07:17 UTC
[R-es] crear variable en base a nombre de columnas que tienen un 1
Efectivamente, el problema venía de respuestas múltiples, pero derivado de un fichero en barbwin que se pasó a spss y no tenía el original. Un software que parece interesante para estas y otro tipo de cosas es openrefine.. http://openrefine.org/ Saludos El 15/04/14 14:44, rubenfcasal escribió:> Hola a todos, > > Aprovecho para hacer también una consulta (no es importante ni > corre prisa, más bien es curiosidad)... > > El problema que comentas tiene el aspecto de un caso de respuestas > múltiples, si es así mejor tratarlo de esta forma. > > Yo para estos casos recurría al SPSS, ¿sabéis o recomendaríais > algún paquete de R para hacer esto? Buscando un poco encontré el > paquete 'MRCV' pero no me convenció mucho. > > Un saludo, > Ruben FC. > > > > El 11/04/2014 12:54, José Luis Cañadas Reche 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 >> > > _______________________________________________ > R-help-es mailing list > R-help-es en r-project.org > https://stat.ethz.ch/mailman/listinfo/r-help-es