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

Jorge I Velez jorgeivanvelez en gmail.com
Mar Jul 7 14:33:15 CEST 2015


Llego un poco tarde a la discusión, pero...

Intenta, a todo costo, evitar subset().  Utilizar indexacion es muchisimo
mas eficiente (aunque no igual de claro) que subset() y los resultados son
los mismos.  Si la base de datos es "pequeña", el tiempo de ejecucion es
similar, pero no ocurre lo mismo cuando la base de datos es "grande".

Saludos cordiales,

Jorge
​Velez

JCSMR, Canberra


2015-07-07 21:52 GMT+10:00 Carlos Ortega <cof en qualityexcellence.es>:

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

	[[alternative HTML version deleted]]



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