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

Carlos Ortega cof en qualityexcellence.es
Mar Jul 7 13:52:05 CEST 2015


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



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