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]]