[R-es] Pasar un listado de variables como argumento de una función

Griera-yandex griera en yandex.com
Mar Jul 7 14:39:56 CEST 2015


Hola Carlos:

He hecho una pruebas, y tienes razón. La solución de "[" es mejor. Imbuido del lenguaje de SAS, me parecía mejor subset. Lo cambio.

Gracias de nuevo y saludos!

On Tue, 7 Jul 2015 13:52:05 +0200
Carlos Ortega <cof en qualityexcellence.es> wrote:

> Hola,
> 
> Pero con lo que quieres hacer, estás definiendo el objetivo de la función
> "subset()".
> Otra cosa es que no te funcione alguno de los casos.
> 
> A mí, el primer caso de "Excluir", me funciona:
> 
> > DATOS <- data.frame(SE    = c("M", "H", "M", "M", "H"),
> +                     EDAD  = c(50,  60,  20,  18,  30),
> +                     GRP_S = c("B", "0", "B", "A", "B"),
> +                     HTA   = c("N", "S", "N", "N", "N"))
> > # Excluir
> > DATOS_S <- subset(DATOS, select = -c(EDAD, GRP_S))
> > names(DATOS_S)
> [1] "SE"  "HTA"
> 
> Para el caso de "Incluir", lo que definies como "c(SE, GRP_S:HTA)", ¿qué
> sentido tiene?.
> Estás definiendo una secuencia "GRP_S:HTA"  cuando ":" se utiliza en el
> contexto que quieres como secuencia entre dos números. Sí, los ":" también
> se utilizan como factores, pero para indicar una interacción de un modelo,
> que no es tu caso.
> 
> Cometiendo un "pecadillo" con la función "attach()" , porque de otra forma
> SE, EDAD y GRP_S no se entienden como variales en el entorno, mira el
> resultado de lo que obtienes:
> 
> > attach(DATOS)
> > c(SE, EDAD:GRP_S)
>  [1]  2  1  2  2  1 50 49 48 47 46 45 44 43 42 41 40 39 38 37 36 35 34 33
> 32 31 30 29 28 27 26 25 24 23 22 21 20
> [37] 19 18 17 16 15 14 13 12 11 10  9  8  7  6  5  4  3
> Warning messages:
> 1: In EDAD:GRP_S :
>   numerical expression has 5 elements: only the first used
> 2: In EDAD:GRP_S :
>   numerical expression has 5 elements: only the first used
> 
> Creo que para la elección de columnas, sigue siendo más recomendable el uso
> de "[" que de "subset()", en esa dirección va lo que te proponía. Y el caso
> de "Incluir", es el complementario de "Excluir", por lo que con esa
> solución puedes funcionar para cualquier caso.
> 
> Mira estas referencias adicionales:
> 
> http://stackoverflow.com/questions/9860090/in-r-why-is-better-than-subset
> http://adv-r.had.co.nz/Subsetting.html#subsetting-operators
> 
> 
> Saludos,
> Carlos Ortega
> www.qualityexcellence.es
> 
> El 7 de julio de 2015, 11:16, Griera <griera en yandex.com> escribió:
> 
> > Hola:
> >
> > Gracias de nuevo por la ayuda!
> >
> > La solución, como no, funciona. Pero yo quería alguna cosa más flexible y
> > universal que le pudiera pasar como parámetro diferentes opciones de
> > incluir i excluir variables. Si estuviera fuera de la función seria:
> >
> > =====================
> > DATOS <- data.frame(SE    = c("M", "H", "M", "M", "H"),
> >                     EDAD  = c(50,  60,  20,  18,  30),
> >                     GRP_S = c("B", "0", "B", "A", "B"),
> >                     HTA   = c("N", "S", "N", "N", "N"))
> > # Excluir
> > DATOS_S <- subset(DATOS, select = -c(EDAD, GRP_S))
> > names(DATOS_S)
> > DATOS_S <- subset(DATOS, select = -c(SE, EDAD:GRP_S))
> > names(DATOS_S)
> > # Incluir
> > DATOS_S <- subset(DATOS, select = c(SE, GRP_S:HTA))
> > names(DATOS_S)
> > =====================
> >
> > Pero cuando le paso a la función -c(EDAD, GRP_S)) o c(SE, GRP_S:HTA)), no
> > funciona. Existe alguna solución que pueda incorporar esta flexibilidad?
> >
> > Gracias Carlos y saludos.
> >
> >
> > On Tue, 7 Jul 2015 00:26:54 +0200
> > Carlos Ortega <cof en qualityexcellence.es> wrote:
> >
> > > Hola,
> > >
> > > Puedes hacerlo de esta otra forma:
> > >
> > > #-----------------
> > > DES = function(XDATOS, XDROP) {
> > >   #print(names(XDATOS))
> > >   #print(XDROP)
> > >   DATOS_S <- XDATOS[, setdiff(names(XDATOS), XDROP) ]
> > >   return(DATOS_S)
> > > }
> > >
> > > DES(DATOS, c("EDAD", "GRP_S"))
> > > #-----------------
> > >
> > >
> > > Saludos,
> > > Carlos Ortega
> > > www.qualityexcellence.es
> > >
> > >
> > > El 6 de julio de 2015, 21:59, Griera <griera en yandex.com> escribió:
> > >
> > > > Hola:
> > > >
> > > > Quiero que una función realice una serie de cálculos pero eliminando
> > las
> > > > variables que no interesan (diferentes según e fichero a analizar).
> > Intento
> > > > pasar esta lista como argumento con un c("VAR1", "VAR2", etc), pero no
> > lo
> > > > consigo. Un ejemplo seria:
> > > >
> > > > DATOS <- data.frame(SE=c("M", "H", "M", "M", "H"),
> > > >                     EDAD=c(50, 60, 20, 18, 30),
> > > >                     GRP_S=c("B", "0", "B", "A", "B"))
> > > > DES = function(XDATOS, XDROP=F)
> > > >         {
> > > >         print(names(XDATOS))
> > > >         DATOS_S <- subset(XDATOS, select = -c(XDROP))
> > > >         }
> > > >
> > > > Sin "" da el error:
> > > >
> > > > > DES(DATOS, c(EDAD, GRP_S))
> > > > [1] "SE"    "EDAD"  "GRP_S"
> > > > Error in print(XDROP) : object 'EDAD' not found
> > > >
> > > > Con "" da el error:
> > > >
> > > > > DES(DATOS, c("EDAD", "GRP_S"))
> > > > [1] "SE"    "EDAD"  "GRP_S"
> > > > [1] "EDAD"  "GRP_S"
> > > > Error in -c(XDROP) : invalid argument to unary operator
> > > >
> > > > Alguien me puede echar una mano. Estoy bien perdido.
> > > >
> > > > Gracias y saludos!
> > > >
> > > > _______________________________________________
> > > > 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
> >
> 
> 
> 
> -- 
> Saludos,
> Carlos Ortega
> www.qualityexcellence.es



Más información sobre la lista de distribución R-help-es