我有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))}
但这显然不起作用。有人可以给我一些帮助吗?
提前致谢 - 达尼
答案 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]))
虽然毫无疑问有更好的方法(我的意思是手动分配列表)。