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

2015-07-06 Thread Carlos Ortega
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  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@r-project.org
> https://stat.ethz.ch/mailman/listinfo/r-help-es
>



-- 
Saludos,
Carlos Ortega
www.qualityexcellence.es

[[alternative HTML version deleted]]

___
R-help-es mailing list
R-help-es@r-project.org
https://stat.ethz.ch/mailman/listinfo/r-help-es


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

2015-07-07 Thread Griera
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  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  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@r-project.org
> > https://stat.ethz.ch/mailman/listinfo/r-help-es
> >
> 
> 
> 
> -- 
> Saludos,
> Carlos Ortega
> www.qualityexcellence.es

___
R-help-es mailing list
R-help-es@r-project.org
https://stat.ethz.ch/mailman/listinfo/r-help-es


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

2015-07-07 Thread Carlos Ortega
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  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  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  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@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@r-project.org
https://stat.ethz.c

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

2015-07-07 Thread Jorge I Velez
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 :

> 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  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  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  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", "GR

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

2015-07-07 Thread Griera-yandex
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  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  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  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  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