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

Кроме того, у вас есть два метода с именем method 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 
Смежные вопросы