循环遍历数据框中的行

Mat*_*hew 8 performance r

假设由于某种原因我需要在数据帧中循环遍历行.

我创建了一个简单的data.frame

df <- data.frame(id = sample(1e6, 1e7, replace = TRUE))
Run Code Online (Sandbox Code Playgroud)

似乎f2比f1慢得多,而我预计它们是等价的.

f1 <- function(v){
        for (obs in 1:(1e6) ){
            a <- v[obs] 
        }
        a
    }
system.time(f1(df$id))

f2 <- function(){
        for (obs in 1:(1e6) ){
            a <- df$id[obs] 
        }
    a
    }
system.time(f2())
Run Code Online (Sandbox Code Playgroud)

你知道为什么吗?他们使用完全相同的内存量吗?

Jos*_*ien 7

如果你改为写下这样的时间并认识到这df$x真的是一个函数调用,`$`(df,x)那么这个谜就会消失:

system.time(for(i in 1:1e6) df$x)
#    user  system elapsed 
#    8.52    0.00    8.53 
system.time(for(i in 1) df$x)
#    user  system elapsed 
#       0       0       0 
Run Code Online (Sandbox Code Playgroud)