将函数应用于每个数据框

时间:2011-01-25 09:27:46

标签: r loops

我有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.

我想设置一个循环并将函数density()应用于每个数据框,返回返回的密度值。

我通过创建列表,设置循环并使用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))}

但这显然不起作用。有人可以给我一些帮助吗?

提前致谢 - 达尼

2 个答案:

答案 0 :(得分:12)

首先,如果要进行手动分配,则应初始化密度。

densities <- list()

其次,您以有趣的方式使用密度函数。您应该在lapply中指定不同的函数。您可以在逗号后面提供函数和额外参数,或者在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

答案 1 :(得分: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]))

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