2015-10-19 22 views
0

我需要将一系列值(value_range)与数据表行中的值进行比较,然后将结果编译为value_range中每个值的总和。向量与每行数据表的向量R的比较很慢

下面的方法#1显示了我正在尝试做的最好的事情。 10次​​循环仅用于比较系统时间。

nb_values = 300 
value_range = c(1:nb_values) 

nb_rows = 1000 
d = data.table(c1 = rep(c(10,30,60,80), (nb_rows/4)) , c2 = rep(2,nb_rows)) 

res1 = data.table(rep(0,nb_values)) 
res2 = data.table(rep(0,nb_values)) 

# METHOD 1 
system.time(
    for(i in (1:10)) 
    { 
     for(i in value_range) res1[i] <- d[, sum((i>c1) & (i>c2)),] 
    } 
) 
# user system elapsed 
# 6.973 0.000 6.982 

# METHOD 2 
f <- function(i) 
{ 
    d[, sum((i>c1) & (i>c2)),] 
} 

system.time(
    for(i in (1:10)) 
    { 
     res2 <- apply(cbind(value_range), 1, f) 
    } 
) 
# user system elapsed 
# 3.152 0.000 3.161 

identical(as.integer(res1$V1), res2) 
# [1] TRUE 

有没有一种方法可以进一步提高速度?

+3

也许你应该用*词*来提问。特别是,你可以解释你正在试图用这些循环做什么,而不是让我们解析它。 – Frank

+0

这可能是我没有看到的东西,但你到底想要达到什么目的? – Heroka

+0

另外,你有两个方法名为方法1 ....是否意味着是方法2? – Frank

回答

2
system.time(
    for(j in 1:10) { 
    res3 <- d[, vapply(value_range, 
         function(i) sum((i > c1) & (i > c2)), 
         FUN.VALUE = 1L)] 
    }) 
#user system elapsed 
#0.15 0.01 0.15 

all.equal(res1$V1, res3) 
#[1] TRUE