2011-01-25 11 views
8

Tengo 4 marcos de datos que contienen una columna de fecha, una columna de precio y una columna de retorno.Aplicar una función a cada marco de datos

datos1:

Date  Price Return 
2009-01-02 100 0.2 
2009-01-03 110 0.1 
etc. 

datos.2:

Date  Price Return 
2009-02-02 60 0.15 
2009-02-03 50 -0.1 
etc. 

me gustaría establecer un bucle y aplicar la función de densidad() para cada trama de datos, la devolución de los valores de densidad para los retornos.

I a través de crear una lista, la creación de un bucle y utilizando lapply() para hacer esto, así

> ff <- list(data.1, data.2, data.3, data.4) 
> for(i in 1:length(ff){ 
     density[[i]] <- lapply(ff, density(ff[[i]]$Return))} 

pero esto obviamente no funciona. ¿Alguien podría ofrecerme algo de ayuda?

Gracias de antemano - Dani

Respuesta

10

En primer lugar, debe inicializar la densidad, si usted quiere hacer que la asignación manual.

densities <- list() 

En segundo lugar, utiliza la función de densidad de una manera divertida. Debe especificar la función diferente en su solicitud. O le da la función y los argumentos adicionales después de la coma, o construye su propia pequeña función personalizada en la llamada de solicitud, como se muestra a continuación.

data.1 <- data.frame(
    X1 = letters[1:10], 
    X2 = 1:10 
) 

data.2 <- data.frame(
    X1 = letters[11:20], 
    X2 = 10:1 
) 

ff <- list(data.1,data.2) 

densities <- lapply(ff,function(i) {density(i$X2)}) 

Esto devuelve una lista automáticamente.

para obtener los datos fuera de él, sólo tiene que utilizar los índices de la lista:

densities[[1]]$x 

Si usted designó a su lista antes, podría utilizar los nombres así:

names(ff) <- c("data.1","data.2") 

densities <- lapply(ff,function(i) {density(i$X2)}) 
densities[['data.1']]$x 
+0

Lo siento, no entiendo. La densidad de un valor? – Dani

+0

@Dani: lo siento, mi error, leí mal –

+0

No hay problema, gracias por la solución. ¡Funciona bien! Tengo una pregunta restante: ¿cómo puedo obtener acceso a los valores que calcula la densidad()? Entonces, por ejemplo, me gustaría seleccionar solo los valores x (que serían los retornos) de la densidad que se calculó para mí. Densities [[1]] selecciona solo el resultado para data.1. ¿Cómo puedo ahora seleccionar solo los valores x interpolados de data.1? densidades [[1 $ x]] no funciona ... – Dani

3

Lo con lapply es que no necesita usar un for-loop. Esto debería funcionar:

data.1=data.2=data.3=data.4=matrix(rnorm(30),ncol=3) 

ff=list(data.1,data.2,data.3,data.4) 

densities=lapply(ff,function(x)density(x[,3])) 

Aunque es indudable que hay una mejor manera de hacer esto (me refiero a la asignación manual de la lista).

Cuestiones relacionadas