[R-es] Media de elementos tomados uno a uno de un data.frame

Oscar Perpiñan Lamigueiro oscar.perpinan en upm.es
Lun Nov 28 11:26:07 CET 2011


Hola,
>Aprovecho para preguntar, ¿porque es mejor utilizar un data.frame en
>vez de una matriz? (En mi ignorancia, y hasta el momento en mi corta 
>trayectoria por R, no he advertido demasiadas diferencias entre los
>dos tipos de objetos)
>

Resumiendo mucho yo diría que un data.frame ofrece conjuntamente las
funcionalidades de una matriz y una lista (por ejemplo, poder acceder a
las "variables" por sus nombres). Más detalles: 
aquíhttp://cran.r-project.org/doc/manuals/R-intro.html#Data-frames

>> est = function(x){
>> n = (x - 1) %/% 3 + 1
>> ests = c('inv', 'pri', 'ver', 'oto')
>> res = ests[n]
>> res
>> }
>
>Vale, entiendo que el objetivo de la función es «cambiar» el número de 
>los meses por la estación a la que pertenecen. Lo que me pierde es la 
>definición de «n», ¿restamos 1 para dividir por tres y sumar 1? No lo 
>pillo, lo siento.

Creo que lo entenderás haciendo estos ejemplos:

 1:12 %/% 3
 0:11 %/% 3

La función es básicamente una adaptación de quarters.POSIXt (donde
as.POSIXlt()$mon está definido como 0:11).

>
>> aggregate(cbind(vel1, vel2) ~ est(meses) + dir, FUN = mean, data =
>> vientos)
>
>Con el ejemplo preparado esto funciona de escandalo, con los datos 
>reales «medio funciona». Varias cosas:
>
>- Con cbind agrupamos las columnas, en los datos reales tengo:
>
>  > dim(Aero.vientos)
>[1] 180  16
>
>dieciséis columnas, que no son demasiadas, pero si hubiera muchas más, 
>¿como podría «pasarlas» a cbind de una tacada?

Prueba con la "dot notation": 

aggregate(. ~ est(meses) + dir,  data = vientos,  FUN = mean)

>(Bueno, poco a poco, acabo de pensar -cosa muy importante, pensar- y 
>probar con as.matrix(Aero.vientos[,3:14]) y funciona aunque las
>columnas del resultado vienen señaladas con NA).
>
>- Segundo problema: ejecutando
No he tenido tiempo de probar tus intentos pero creo que el problema
está en el método de aggregate que empleas. Si lo primero que le
entregas es una fórmula, el método aggregate.formula interpreta la
fórmula usando lo que le proporciones como "data". Pero si lo primero
que le das es un data.frame, entonces el segundo argumento es "by" y no
necesita "data".

>> En la
>> ayuda de aggregate te cuentan como conseguir resultados de varias
>> funciones a la vez.
>
>Pues he repasado toda la ayuda y, la verdad, no he visto nada.

Tienes razón, está explicado en algún ejemplo de la lista R-help, no en
la ayuda de la función. Prueba con esto:

foo <- function(x,...){
  cbind(median(x),  mean(x),  sd(x))
  }

aggregate(cbind(vel1,  vel2) ~ est(meses) +  dir,  FUN = foo,  data =
vientos)


Saludos.

Oscar.



Más información sobre la lista de distribución R-help-es