gpt4 book ai didi

r - 对列表的每个元素分别应用一个函数

转载 作者:行者123 更新时间:2023-12-02 22:31:35 25 4
gpt4 key购买 nike

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

这是我的问题:

我有一个 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”代表一些空间坐标。

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

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

最终目标是为每 10 个区域设置一个值“z”(我的结果),距离我列表中每个 DF 的最近点(根据坐标)。这意味着对于一个区域:10 个来 self 列表的 DF1 的结果“z”,然后 10 个来自 DF2 的其他结果“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]
)

关于r - 对列表的每个元素分别应用一个函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12156939/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com