несколько этапов предварительной обработки необходимы, насколько я могу сказать ....
Загрузите данные:
data a1 ;
input a b c ;
cards ;
2 3 4
1 2 3
;run ;
data a2 ;
input a b d ;
cards ;
0 0.3 1
0 0.2 0
;run ;
Пуллы все имена переменных в A1 и A2 наборах данных (обновить Имя_библиотеки если требуется):
proc sql ;
create table data1 as
select libname, memname, name, label
from sashelp.vcolumn
where libname= 'WORK' and memname in ('A1','A2')
order by name
;quit ;
Хранить только переменные, которые являются общими для обоих наборов данных:
data data2 ;
set data1 ;
by name ;
if last.name and not first.name ;
run ;
Помещенных как список и подсчет общих переменных в макропеременные:
proc sql ;
select name
into :commvarnames separated by ' '
from data2
;
select count(name)
into :commoncount
from data2
;quit ;
Читать в исходных наборах данных - загрузите первый, перенесите их во временном массив (поэтому они не перезаписывают переменные значения), а затем загрузить второй набор данных и выполнить вычисления в цикле do:
data output ;
set a1(keep=&commvarnames) ;
array one(&commoncount) _temporary_ ;
array two(&commoncount) &commvarnames ;
* Load A1 to temporary array ;
do i=1 to &commoncount ;
one(i)=two(i) ;
end ;
* Load A2 to variables ;
set a2(keep=&commvarnames) ;
do i=1 to &commoncount ;
product=sum(product,one(i)*two(i)) ;
end ;
run ;
Да, это кажется немного сложным, и я подумал. Я должен попытаться избежать такого расчета, используя некоторую предварительную обработку. – Lovnlust