Griera
2015-Jul-07 09:16 UTC
[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 <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
Carlos Ortega
2015-Jul-07 11:52 UTC
[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 <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]]
Jorge I Velez
2015-Jul-07 12:33 UTC
[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 <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]]
Griera-yandex
2015-Jul-07 12:39 UTC
[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 <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