множественный выбор из оценочной таблицы в R!

PlanB
Дата: 08.08.2017 13:52:52
имеется оценочная таблица
Q_catprov_calcs3_froms3_to
100.001.00
210.000.90
2100.900.99
2200.991.00
3210.000.60
3300.600.65
3500.651.00
4510.000.99
4600.991.00
51000.001.00
и два вектора
x1<-round(runif(10000,min=1,max=5),0) #значения [1,2,3,4,5]
x2<-runif(10000,min=0,max=1) #случайные числа (0,1]

Мне необходимо создать вектор x3, который в зависимости от значения x1 (сравнивается с q_cat в таблице) и диапазона, в который попадает х2 (задается s3_from и s3_to) принимает то или иное значение prov_calc. Вроде и не сложно, вот так работает, но слишком долго
library(doParallel)
x3<-foreach(i=1:length(x1)) %do% {rvps$prov_calc[x1[i]==rvps$Q_cat & x2[i]>rvps$s3_from & x2[i]<=rvps$s3_to]}
#system.time=2.87
Как векторизовать выбор из таблицы? всем спасибо заранее!
PlanB
Дата: 08.08.2017 17:02:56
как вариант - вручную загонять в ifelse. но очень хочется через оценочную таблицу.
x32<-ifelse(x1==1,0,
     ifelse(x1==2,
            ifelse(x2>0 & x2<=0.9,1,
            ifelse(x2>0.9 & x2<=0.99,10,
            ifelse(x2>0.99 & x2<=1,20,20))),
     ifelse(x1==3,
            ifelse(x2>0 & x2<=0.6,21,
            ifelse(x2>0.6 & x2<=0.65,30,
            ifelse(x2>0.65 & x2<=1,50,50))),
     ifelse(x1==4,
            ifelse(x2>0 & x2<=0.99,51,
            ifelse(x2>0.99 & x2<=1,60,60)),
     ifelse(x1==5,100,100)))))
#system.time=0.02
PlanB
Дата: 09.08.2017 12:47:37
третий вариант, то, что мне и нужно было изначально. mapply, в отличие от других функций семейства *apply умеет использовать в качестве аргументов пользовательской функции значения двух (и более, полагаю) векторов последовательно. т.е. имеет место следующая логика на первой итерации: *apply: x1[1], x2[1:lenght(x2)]; mapply: x1[1], x2[1].
rvps.prob<-function(X,Y) {rvps$prov_calc[X==rvps$Q_cat & Y>rvps$s3_from & Y<=rvps$s3_to]}
xx3<-mapply(rvps.prob,x1,x2)
#system.time=0.59
минус - слишком долго работает...
PlanB
Дата: 14.08.2017 10:09:20
выкладываю наиболее быстрый вариант из всех. додуматься до векторизации изначально поставленной задачи мне не удалось.

начальные данные
mm1<-round(runif(200000,min=1,max=5),0) #random values [1;2;3;4;5]
mm2<-runif(200000,min=0,max=1) #random num (0,1]  
код процедуры. требуется библиотека {dplyr}
library(dplyr)
system.time({ #rvps in stress #mm4 - rvps old
mm3<-case_when(
  mm1==1 ~ 0,
  mm1==2 & mm2>0 & mm2<= 0.9 ~ 1,
  mm1==2 & mm2>0.9 & mm2<= 0.99 ~ 10,
  mm1==2 & mm2>0.99 & mm2<= 1 ~ 20,
  mm1==3 & mm2>0.0 & mm2<= 0.6 ~ 21,
  mm1==3 & mm2>0.6 & mm2<= 0.65 ~ 30,
  mm1==3 & mm2>0.65 & mm2<= 1 ~ 50,
  mm1==4 & mm2>0 & mm2<= 0.99 ~ 51,  
  mm1==4 & mm2>0.99 & mm2<= 1 ~ 60,
  mm1==5 ~ 100)
})#system.time=0.08