powered by simpleCommunicator - 2.0.59     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Программирование [игнор отключен] [закрыт для гостей] / множественный выбор из оценочной таблицы в R!
4 сообщений из 4, страница 1 из 1
множественный выбор из оценочной таблицы в R!
    #39501856
PlanB
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
имеется оценочная таблица
Q_catprov_calcs3_froms3_to100.001.00210.000.902100.900.992200.991.003210.000.603300.600.653500.651.004510.000.994600.991.0051000.001.00и два вектора
Код: vbnet
1.
2.
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. Вроде и не сложно, вот так работает, но слишком долго
Код: vbnet
1.
2.
3.
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

Как векторизовать выбор из таблицы? всем спасибо заранее!
...
Рейтинг: 0 / 0
множественный выбор из оценочной таблицы в R!
    #39501990
PlanB
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
как вариант - вручную загонять в ifelse. но очень хочется через оценочную таблицу.
Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
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
...
Рейтинг: 0 / 0
множественный выбор из оценочной таблицы в R!
    #39502506
PlanB
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
третий вариант, то, что мне и нужно было изначально. mapply, в отличие от других функций семейства *apply умеет использовать в качестве аргументов пользовательской функции значения двух (и более, полагаю) векторов последовательно. т.е. имеет место следующая логика на первой итерации: *apply: x1[1], x2[1:lenght(x2)]; mapply: x1[1], x2[1].
Код: vbnet
1.
2.
3.
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

минус - слишком долго работает...
...
Рейтинг: 0 / 0
множественный выбор из оценочной таблицы в R!
    #39504799
PlanB
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
выкладываю наиболее быстрый вариант из всех. додуматься до векторизации изначально поставленной задачи мне не удалось.

начальные данные
Код: vbnet
1.
2.
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}
Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
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
...
Рейтинг: 0 / 0
4 сообщений из 4, страница 1 из 1
Форумы / Программирование [игнор отключен] [закрыт для гостей] / множественный выбор из оценочной таблицы в R!
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]