我有一个关于在列表的每个元素上应用函数的问题。
这是我的问题:
我有一份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”中,而另外两列“x”和“y”表示一些空间坐标。
我有另一个独立的DF,其中包含一个“x”和“y”的列表,代表一些特定的区域(想象10个区域):
region <- data.frame(x=c(1:10),y=c(21:30),region=c(1:10))
最终目标是从每个10个区域得到一个值“z”(我的结果)来自我列表中每个DF的最近点(根据坐标)。 这意味着对于一个区域:10个结果“z”来自我的列表的DF1,然后10个其他结果“z”来自DF2,...... 如果可能的话,我的最终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”)。 / p>
我已经有一个小函数来查找最近的值:
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变量循环。
你能帮助我改变循环中应该改变什么才能拥有我正在寻找的东西吗?
非常感谢!
答案 0 :(得分: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]
)