加速R中的循环运算

加速R中的循环运算

我在R中有一个很大的性能问题,我编写了一个函数,在data.frame对象。它只是将一个新列添加到data.frame积累一些东西。(简单操作)。这个data.frame大约有850 K行。我的电脑还在工作(现在大约10小时),我对运行时一无所知。

dayloop2 <- function(temp){
    for (i in 1:nrow(temp)){    
        temp[i,10] <- i        if (i > 1) {             
            if ((temp[i,6] == temp[i-1,6]) & (temp[i,3] == temp[i-1,3])) { 
                temp[i,10] <- temp[i,9] + temp[i-1,10]                    
            } else {
                temp[i,10] <- temp[i,9]                                    
            }
        } else {
            temp[i,10] <- temp[i,9]
        }
    }
    names(temp)[names(temp) == "V10"] <- "Kumm."
    return(temp)}

有什么办法加快这个行动吗?


潇湘沐
浏览 1043回答 3
3回答

哈士奇WWW

如果你用for循环,您很可能是在编码R,就好像它是C、Java或其他什么东西一样。正确矢量化的r代码非常快。例如,以这两段简单的代码为例,按顺序生成一个包含10,000个整数的列表:第一个代码示例是如何使用传统的编码范式编写循环代码。它需要28秒才能完成system.time({ &nbsp;&nbsp;&nbsp;&nbsp;a&nbsp;<-&nbsp;NULL &nbsp;&nbsp;&nbsp;&nbsp;for(i&nbsp;in&nbsp;1:1e5)a[i]&nbsp;<-&nbsp;i}) &nbsp;&nbsp;&nbsp;user&nbsp;&nbsp;system&nbsp;elapsed&nbsp; &nbsp;&nbsp;28.36&nbsp;&nbsp;&nbsp;&nbsp;0.07&nbsp;&nbsp;&nbsp;28.61通过简单的预分配内存操作,您可以得到几乎100倍的改进:system.time({ &nbsp;&nbsp;&nbsp;&nbsp;a&nbsp;<-&nbsp;rep(1,&nbsp;1e5) &nbsp;&nbsp;&nbsp;&nbsp;for(i&nbsp;in&nbsp;1:1e5)a[i]&nbsp;<-&nbsp;i}) &nbsp;&nbsp;&nbsp;user&nbsp;&nbsp;system&nbsp;elapsed&nbsp; &nbsp;&nbsp;&nbsp;0.30&nbsp;&nbsp;&nbsp;&nbsp;0.00&nbsp;&nbsp;&nbsp;&nbsp;0.29但是使用基R向量操作使用冒号运算符:这一操作几乎是即时的:system.time(a&nbsp;<-&nbsp;1:1e5) &nbsp;&nbsp;&nbsp;user&nbsp;&nbsp;system&nbsp;elapsed&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0
打开App,查看更多内容
随时随地看视频慕课网APP