2011-01-25 61 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])) 

虽然毫无疑问有更好的方法来做到这一点(我的意思是手动分配列表)。

相关问题