2013-09-27 3 views
2
ID a1 a2 a3 a4 _1 _2 _3 _4 _5 _6 _7 _8 _9 
1 _1 _3 _6 _9  8 5 9 8 6 10 2 1 4 
2 _2 _5 _8 _9 10 6 2 7 10 8 3 5 9 
3 _1 _2 _4 _8  3 6 1 9 6 9 3 0 4 
...  ...    ... 

Здесь a1-а4 показывает число столбцов, которые соответствующее имя переменного _1-_9.I хочет создать три переменные v1, v2, v3, гдеКак передать значение переменной аргументу функции в макросе SAS?

For ID=1, v1=sum(of _1-_3), v2=sum(of _3-_6),v3=sum(of _6-_9); 
For ID=2, v1=sum(of _2-_5), v2=sum(of _5-_8),v3=sum(of _8-_9); 
For ID=3, v1=sum(of _1-_2), v2=sum(of _2-_4),v3=sum(of _4-_8); 
....  ...     

Например, для ID = 1, v1 = 8 + 5 + 9 = 22, v2 = 9 + 8 + 6 + 10 = 33.
Вот мой код:

%Macro sumup; 
    data test; set test; 
     %do n=1 %to 3; 
      v&n=sum (of a&n-a%eval(&n+1)); 
     %end; 
    run; 
%mend; 
%sumup; 

Проблема состоит в том, что & п и% Eval (& п + 1), рассматриваются в качестве имени переменной. Но я хочу рассматривать их значения как имя переменной. Я знаю, что в вызове execute мы можем использовать '|| a & n ||'. Но как насчет макроса? Спасибо!

ответ

2

Вы не можете получить к нему доступ прямо так; SAS должен знать, как скомпилировать инструкции до того, как они узнают, каковы фактические значения. Однако вы можете сделать это с помощью массивов.

data want; 
    set test; 
    array nums _1-_9; 
    array as a1-a4; 
    array vs v1-v3; 
    do n=1 to 3; 
    do i = as[n] to as[n+1]; 
     vs[n] = sum(vs[n],nums[i]); 
    end; 
    end; 
run; 
+0

Опечатка: v [_n] должно быть vs [_n]. Когда я запускал ваш код, в журнале отображается ошибка. ОШИБКА: неверная информация управления контуром DO, либо выражение INITIAL или TO отсутствует, либо выражение BY отсутствует, равно нулю или недействительно. – Jennyapple

+0

Это означает, что поскольку [n] или как [n + 1] не существует или отсутствует. – Joe

+0

На самом деле это потому, что они вводятся как строки. После преобразования их в числовые значения ваш код работает! Спасибо! – Jennyapple

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