2012-08-28 119 views
1

我有一个关于在列表中的每个元素上应用函数的问题。在列表中的每个元素上分别应用一个函数

这里是我的问题:

我有DF的列表(我分一个更大的DF由天):

mydf <- data.frame(x=c(1:5), y=c(21:25),z=rnorm(1:5)) 
mylist <- rep(list(mydf),5) 
names(mylist) <-c("2006-01-01","2006-01-02","2006-01-03","2006-01-04","2006-01-05") 

不要在乎这个假数据,如果是相同的),它只是为例。我在列表“z”列中列出了每个DF的结果,以及其他两列“x”和“y”代表了一些空间坐标。

我有含另一个独立的DF的“x”和“y”的列表太,代表一些特定的区域(想象10个区):

region <- data.frame(x=c(1:10),y=c(21:30),region=c(1:10)) 

最终目的是要为每个10个区域,从我列表中每个DF的最近点(根据坐标)得到一个值“z”(我的结果)。 这意味着对于一个区域:来自我的列表DF1的10个结果“z”,然后来自DF2的另外10个结果“z”,... 如果可能的话,我的最终DF应该看起来像这样(对于结构):

final1 <- data.frame("2006-01-01"=rnorm(1:10),"2006-02-01"=rnorm(1:10), 
"2006-03-01"=rnorm(1:10),"2006-04-01"=rnorm(1:10),"2006-05-01"=rnorm(1:10)) 

有一列一天(所以列表中有一个DF),每行有一个值(例如对于2006-01-01:从与第一个区域最近的点开始的值“z”)。

我已经有一个小功能来寻找最接近的值:

min.dist <- function(p, coord){ 
    which.min(colSums((t(coord) - p)^2)) 
} 

于是,我试图做一个循环,有我想要的,但我有列表中的困难。我需要把2个变量放在循环中,但它不起作用。

这工作约,如果我只是把我的名单1 DF:

for (j in 1:nrow(region)){ 

imin <- min.dist(c(region[j,1],region[j,2]),mylist[[1]][,1:2]) 
imin[j] <- min.dist(c(region[j,1],region[j,2]),mylist[[1]][,1:2]) 
final <- mylist[[1]][imin[j], "z"] 
final[j] <- mylist[[1]][imin[j], "z"] 
final <- as.data.frame(final) 
} 

但是,如果我选择了我的整个列表(才能有结果的一列在对象列表中的每个DF“最后“),我有错误。

我认为第一个问题是“区域”的长度与我的列表长度不同,第二个可能是关于为我的列表长度添加第二个变量。 我不太熟悉循环,所以使用双变量循环。

你能帮我在循环中改变什么应该改变,以获得我要找的东西吗?

非常感谢!

+0

在你的循环中,'plante'和'region'没有被定义。请创建一个工作示例。 – Pop

+0

区域在我的帖子的开头定义。对于plante来说,这是一个错误。我在循环中改变了它。这个循环不是真正可复制的,因为我的问题出现在这个循环中。这只是试图向你展示我想要做的事情。所以也许有一个最简单的方法来做到这一点,或者这个循环应该得到改善,但是我不能用我的R知识来做到这一点。 – jeff6868

回答

5

您可以使用lapply()在列表上应用函数。

这应该工作。它返回一个向量列表。

lapply(
    mylist, 
    FUN = function(mydf) 
    mydf[apply(
     region[, -3], 
     1, 
     FUN = function(x) 
     which.min(apply(
      mydf[, -3], 
      1, 
      FUN = function(y) 
      dist(rbind(x, y)) 
     )) 
    ), 3] 
) 
相关问题