【发布时间】:2015-01-06 18:14:59
【问题描述】:
我在优化一段 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。有什么建议吗?
【问题讨论】:
-
什么是
columns?我是否理解得很好,value是具有 2 个可能值的向量:100 和 1000? -
在for循环之前...
columns是values-frame和solutions-martrix的变化列数。取决于特定的输入(在实际脚本中可能有 10000+ 列)。myfunction在实际脚本中要复杂得多。它仍然只是一系列 if 分支。每个values-frame由for 循环和myfunction构建,并绑定到solutions矩阵。 -
你试试
solution <- rbind(solution,values)试试solution[i,] = values?据我了解,您已经创建了solution矩阵,因此无需绑定下一行。将现有行 od NA 更改为value更有效。也许这样就可以了? -
solution已创建但“未完成”,因为此处显示的 for 循环位于另一个依赖于solution的 for 循环中。
标签: r for-loop optimization lapply rbind