Re: [R-es] Pasar un listado de variables como argumento de una función
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
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
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
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
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