gpt4 book ai didi

将 for 循环中的 rbind 替换为 lapply? ( hell 第二圈)

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

我在优化一段 R 代码时遇到问题。以下示例代码应该说明我的优化问题:

一些初始化和函数定义:

a <- c(10,20,30,40,50,60,70,80)
b <- c(“a”,”b”,”c”,”d”,”z”,”g”,”h”,”r”)
c <- c(1,2,3,4,5,6,7,8)
myframe <- data.frame(a,b,c)
values <- vector(length=columns)
solution <- matrix(nrow=nrow(myframe),ncol=columns+3)

myfunction <- function(frame,columns){
athing = 0
if(columns == 5){
athing = 100
}
else{
athing = 1000
}
value[colums+1] = athing
return(value)}

有问题的 for 循环如下所示:

columns = 6
for(i in 1:nrow(myframe){
values <- myfunction(as.matrix(myframe[i,]), columns)
values[columns+2] = i
values[columns+3] = myframe[i,3]
#more columns added with simple operations (i.e. sum)

solution <- rbind(solution,values)
#solution is a large matrix from outside the for-loop
}

问题似乎出在 rbind 函数上。我经常收到有关 solution 大小的错误消息,该消息在一会儿(超过 50 MB)。我想用列表和 lapply 和/或 foreach 替换此循环和 rbind 。我已经开始将 myframe 转换为列表。

myframe_list <- lapply(seq_len(nrow(myframe)), function(i) myframe[i,])

尽管我尝试应用此 very good introduction to parallel processing,但我并没有真正比这更进一步。 .

如何在不更改 myfunction 的情况下重建 for 循环?显然我对不同的解决方案持开放态度......

编辑:这个问题似乎直接来自 2nd circle of hell from the R Inferno 。有什么建议吗?

最佳答案

在这样的循环中使用 rbind 是不好的做法,因为在每次迭代中,您都会放大 solution 数据框,然后将其复制到新对象,这是一个非常慢的过程,还可能导致内存问题。解决这个问题的一种方法是创建一个列表,其第 i 个组件将存储第 i 个循环迭代的输出。最后一步是在该列表上调用 rbind (仅在最后一次)。这看起来像

my.list <- vector("list", nrow(myframe))
for(i in 1:nrow(myframe)){
# Call all necessary commands to create values
my.list[[i]] <- values
}
solution <- rbind(solution, do.call(rbind, my.list))

关于将 for 循环中的 rbind 替换为 lapply? ( hell 第二圈),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26843861/

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