繁体   English   中英

将函数分别应用于列表的每个元素

[英]apply a function separately on each element of a list

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

这是我的问题:

我有一份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") 

不必关心这些伪造的数据是否相同),仅用于示例。 我将结果放在列表的每个DF的“ z”列中,并将另外2列“ 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)
} 

但是,如果我选择了整个列表(为了使对象“ final”中的列表的每个DF具有一列结果),则会出错。

我认为第一个问题是“区域”的长度与列表的长度不同,第二个问题可能是针对列表的长度添加第二个变量。 我对循环不太熟悉,因此对2变量循环也不太熟悉。

您能帮助我在循环中进行哪些更改,以便获得所需的内容吗?

非常感谢你!

您可以使用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]
)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM