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
variables que no interesan (diferentes según e fichero a analizar).
pasar esta lista como argumento con un c("VAR1", "VAR2", etc), pero
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!