2011-01-25 39 views
8

我有4個數據框,其中包含日期列,價格列和返回列。對每個數據框應用函數

data.1:

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

data.2:

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

我想建立一個循環和應用功能密度()到每個數據幀,返回的密度值爲回報。

我大約創建列表,建立一個環,並使用lapply()來做到這一點,所以

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

但是這顯然是行不通的。有人能幫我一些嗎?

在此先感謝 - 達尼

回答

10

首先,你應該,如果你想這樣做手工分配初始化密度。

densities <- list() 

其次,你可以用一種有趣的方式使用密度函數。你應該在你的樂譜中指定不同的功能。您可以在逗號後給出函數和額外參數,也可以在lapply調用中構造自己的自定義小函數,如下所示。

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)}) 

這會自動返回一個列表。

來獲取數據出來,你只需使用列表索引:

densities[[1]]$x 

如果你命名你的列表之前,你可以使用的名稱,以及:

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

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

對不起,我不明白。其中一個值的密度是多少? – Dani 2011-01-25 09:49:53

3

事情與lapply是你不需要使用for循環。這應該工作:

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])) 

雖然毫無疑問有更好的方法來做到這一點(我的意思是手動分配列表)。

相關問題