gpt4 book ai didi

r - 在改变参数的情况下使用lapply

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

R教科书继续促进使用lapply而不是循环。即使对于带有类似参数的函数,这也很容易

lapply(somelist, f, a=1, b=2) 

但是,如果参数根据list元素而改变,该怎么办?
假设我的 list 包括:
somelist$USA
somelist$Europe
somelist$Switzerland

再加上具有相同区域的 anotherlist,我想对这些变化的参数使用lapply吗?例如,当f是比率计算时,这可能很有用。
lapply(somelist, f, a= somelist$USA, b=anotherlist$USA) 

除了循环之外,还有其他方法可以有效地在这些区域中运行吗?

编辑:
我的问题似乎是我尝试使用以前编写的没有索引的函数...
ratio <-function(a,b){
z<-(b-a)/a
return(z)
}

导致
lapply(data,ratio,names(data))

这不起作用。也许其他人也可以从这个错误中学到东西。

最佳答案

应用列表名称,而不是列表元素。例如。:

somelist <- list('USA'=rnorm(10), 'Europe'=rnorm(10), 'Switzerland'=rnorm(10))
anotherlist <- list('USA'=5, 'Europe'=10, 'Switzerland'=4)
lapply(names(somelist), function(i) somelist[[i]] / anotherlist[[i]])

编辑:

您还询问是否有一种方法“除了循环”才能“有效”地执行此操作。您应注意,申请不一定会更有效。效率可能取决于内部功能的速度。如果要对列表的每个元素进行操作,则无论是否将其隐藏在apply()调用中,都将需要一个循环。检查这个问题: Is R's apply family more than syntactic sugar?

我上面给出的示例可以重写为for循环,并且您可以进行一些幼稚的基准测试:
fun1 <- function(){
lapply(names(somelist), function(i) somelist[[i]] / anotherlist[[i]])
}
fun2 <- function(){
for (i in names(somelist)){
somelist[[i]] <- somelist[[i]] / anotherlist[[i]]
}
return(somelist)
}
library(rbenchmark)

benchmark(fun1(), fun2(),
columns=c("test", "replications",
"elapsed", "relative"),
order="relative", replications=10000)

我的机器上基准测试的输出是这样的:
    test replications elapsed relative
1 fun1() 10000 0.145 1.000000
2 fun2() 10000 0.148 1.020690

尽管这不是一个实际的工作应用程序,并且这些功能不是现实的任务,但是您可以看到计算时间的差异可以忽略不计。

关于r - 在改变参数的情况下使用lapply,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6253159/

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