2015-05-27 3 views
1
data a1 

a b c 
2 3 4 
1 2 3 

data a2 

a b d 
0 .3 1 
0 .2 0 


proc sql; 
create table a3 as 
select a.*, a.a * b.a + a.b * b.b as Value 
from a1 a, a2 b; 

Есть много общих столбцов в a1 и a2 (числовые столбцы с различными значениями). Я хочу рассчитать Value как «sumproduct» этих общих столбцов.произведения общих переменных в двух наборах данных

Я стараюсь, чтобы избежать чего-то вроде a.common1 * b.common1 + a.common2 * b.common2 + ...

ответ

1

несколько этапов предварительной обработки необходимы, насколько я могу сказать ....

Загрузите данные:

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 ; 
+0

Да, это кажется немного сложным, и я подумал. Я должен попытаться избежать такого расчета, используя некоторую предварительную обработку. – Lovnlust

1

Это займет совсем немного кода, чтобы сделать эту динамику. Я бы разбить его так:

  • Получить списки переменных, присутствующих в каждом наборе данных
  • Объединение списков, чтобы получить список общих переменных
  • поток это в какой-то логики массива в данных Этап

Опубликует некоторый код позже, но, надеюсь, этого достаточно, чтобы дать вам несколько идей.

+0

спасибо. Это действительно помогает. Кажется, использование массива неизбежно. – Lovnlust

Смежные вопросы