2015-10-19 70 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