Foro de debate

Función para crear vector con datos filtrados

Función para crear vector con datos filtrados

by Víctor Ramón -
Number of replies: 4

Antes que nada decir que esta es mi primera consulta en el foro y también que acabo de descubrir esta increible aplicación, por lo que os pido paciencia y comprensión.

Lo que sí he podido entender es que las posibilidades son inmensas por lo que, por pedir que no quede.

Esta es mi consulta:

Tengo recopilados una cantidad inmensa de datos producto de muchos años de trabajo. En este gran data.frame tengo, entre otros 27 campos: fecha, sexo y edad.

Lo que quiero es crear automáticamente, matrices con los datos ya filtrados por esos 3 campos. Es decir:

filt2003H8 sería el subgrupo fecha=2003, sexo="H" y edad = 8

para así poder realizar pruebas o gráficas rápidamente llamando sólo a la matriz que contenga los datos requeridos.

la instrucción individual sería algo así:

filt2003H8<-subset(bigframe,an==2003&sex=="H"&ed==8)

Podéis pensar que podría crearlos a mano, uno a uno pero tengo datos de 15 años y de edades entre 6 y 14 años.

Otra posibilidad sería simplemente filtrar los datos cada vez que necesitara hacer algún cálculo con algún grupo pero me parece poco práctico.

Lo ideal sería una función con un bucle que creara las matrices y las almacenara en memoria para poder utilizarlas en cualquier momento.

He intentado crear la siguiente función para que me dé la matriz que quiero de forma más rápida pero no la almacena en memoria las matrices

submat<-function(an,sx,ed){

  if(an==2002){prov<-eur2002}

 ...

  if(an==2016){prov<-eur2016}

  if(sx==0){vu<-subset(prov,prov$Sex=="M")}

  if(sx==1){vu<-subset(prov,prov$Sex=="H")}

  if(ed==6){fi<-subset(vu,vu$Edad>=6 & vu$Edad<=7)}

 ...

  if(ed==15){fi<-subset(vu,vu$Edad>=15 & vu$Edad<=16)}

  año<-prov

  año_sex<-vu

  año_sex_edad<-fi

}       

Muchas gracias por vuestra ayuda.


In reply to Víctor Ramón

Re: Función para crear vector con datos filtrados

by Manuel Muñoz Márquez -

Hola Víctor:

Si construyes las matrices y las guardas en memoria, cuando cierres R las pierdes, así que tendrías que volvelo a hacer al iniciar R nuevamente.

Para hacer lo que pretendes deberías guardas los conjuntos de datos por separado en diferentes archivos.

Personalmente, no veo la ganancia en filtrar los datos y crear conjuntos de datos separados, eso sólo sería útil si el conjunto de datos fuese tan grande que la operación de filtrado llevase mucho tiempo.

En tu código observo que utilizas el mismo nombre varias veces, lo que ocurre es que estás construyendo una matriz y almacenándola el la misma variable que la anterior y, por tanto, la machaca. Tendrías que usar diferentes variables para cada matriz.

Un saludo.

In reply to Manuel Muñoz Márquez

Re: Función para crear vector con datos filtrados

by Víctor Ramón -

Hola Manuel. Muchas gracias por responder.

Entiendo lo que me explicas. Como ya dije, no sé hasta qué punto valdría la pena tener en memoria de forma permanente todos los grupos de datos.

Como puedes ver, ya tengo creada una submatriz para cada año: (eur2002, eur2003... eur2016) y me resulta muy útil para obtener cualquier gráfica, cálculo estadístico, etc. pero, como digo, el grupo de datos de cada año incluye datos de mujeres y hombres de todas las edades por lo que el 99% de las veces los cálculos implican siempre utilizar filtros. Por ello, si la función no es excesivamente complicada pienso que sí me resultaría útil. 

La idea sería crear una función que sólo se ejecutara una vez para que creara automáticamente todos los objetos (subgrupos de datos) codificados por el nombre (o quizá un objeto list que los contenga todos).

La segunda cuestión era también, además que la utilidad que me puede suponer, lo que implica de reto de aprendizaje, es decir, la típica pregunta de ¿cómo se haría esto?

Voy a seguir investigando por lo que si a alguien se le ocurre algo, va a ser muy bien recibido.

Felicidades por el foro.

Un saludo.

In reply to Víctor Ramón

Re: Función para crear vector con datos filtrados

by Víctor Ramón -

 Hola a todos de nuevo.

Creo que he hecho avances en mi empeño de abreviar la llamada a los subconjuntos de datos de mi gran data frame.

Os recuerdo cual era el problema:

Tengo una gran tabla (30 variables y más de 6000 casos) cuyos datos proceden del mismo tipo de muestras tomadas a lo largo de 13 años a personas de ambos sexos y de distintas edades.

He creado y codificado de forma manual los subgrupos correspondientes a cada año (eur2002, eur2003...) pero para poder realizar los cálculos y las pruebas de interés necesito además clasificar cada uno de ellos por sexo y edad.

La cuestión que planteaba al principio era:

¿No convendría intentar invertir un poco de tiempo en crear una función con los 3 parámetros: año, sexo y edad para que automáticamente me deje en memoria todas las submatrices de datos codificadas por nombre (eu2002H6, eu2002M6, eu2002H7...)?

Como parece que esto es muy difícil (al menos para mí) me lo he planteado de otra forma:

En vez de que la función genere todos los objetos para dejarlos permanentemente en memoria, se trataría ahora de crear una función con esos tres parámetros que devuelva en el momento la submatriz requerida y que permita utilizar cualquiera de sus variables para realizar cálculos o pruebas estadísticas. 

Eso es lo que creo haber conseguido con una sencilla función utilizando el objeto list():

primero meto todos los grupos por año que había creado en una lista:

todos<-list(eur2002,eur2003,eur2004,eur2005,eur2006,eur2007,eur2008,eur2010,eur2011,eur2012,eur2013,eur2014,eur2015)

después gracias a esta sencilla función:

subgr<-function(a,s,e){

  i=a-2001

  if(s==0){atr<-subset(todos[[i]],todos[[i]]$Sex=="H" & todos[[i]]$Edad>=e & todos[[i]]$Edad<e+1)}

  if(s==1){atr<-subset(todos[[i]],todos[[i]]$Sex=="M" & todos[[i]]$Edad>=e & todos[[i]]$Edad<e+1)}

  return(atr)

}

ya puedo realizar cálculos de forma rápida:

Por ejemplo:

Para obtener la media de la variable T1 correspondiente a los indivíduos varones de 7 años de los datos de 2010:

mean(subgr(2010,0,7)$T1,na.rm=T)

Espero que le sirva a alguien.


In reply to Víctor Ramón

Re: Función para crear vector con datos filtrados

by Manuel Muñoz Márquez -

Hola Victor:

Me permito hacerte alguna sugerencia sobre tu código:

  • Codificar los valores de sexo numéricamente puede llevar a confusión, ¿cuál es 0 y cuál 1?, no hay ningún inconveniente en usar 'H' y 'M'.
  • Dentro de la función utilizas la variable todos que no se ha pasado a la función como parámetro, eso hace que la función sea poco reusable, pues depende del nombre del conjunto de datos a usar, yo la definiría como
    subgr <- function(todos, a, s, e)

    Un saludo