[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