Создать таблицу с циклом в SAS

Когда у вас есть стол, как;

somefield1 somefield2 lastterm1 lastterm2
(10) (20) (1) (-)
(20) (40) (1) (2)
(30) (50) (-) (2)

и попробуйте сгруппировать для каждого термина, есть ли более простой способ сделать это, чем;

PROC SQL;
    CREATE TABLE WORK.LAST_TERM1 AS 
    SELECT T1.LASTTERM1,
    (MEAN(t1.'somefield1'n)) FORMAT=COMMAX14.2 AS 'MEAN_of_somefield1'n,
    (MEAN(t1.'somefield2'n)) FORMAT=COMMAX14.2 AS 'MEAN_of_somefield2'n

    FROM WORK.MAIN_TABLE t1
GROUP BY t1.LASTTERM1;
RUN;
PROC SQL;
    CREATE TABLE WORK.LAST_TERM2 AS 
    SELECT T1.LASTTERM2,
    (MEAN(t1.'somefield1'n)) FORMAT=COMMAX14.2 AS 'MEAN_of_somefield1'n,
    (MEAN(t1.'somefield2'n)) FORMAT=COMMAX14.2 AS 'MEAN_of_somefield2'n

    FROM WORK.MAIN_TABLE t1
GROUP BY t1.LASTTERM2;
RUN;

Это не проблема с двумя полями и двумя терминами, но когда у вас есть 20 терминов и 200 полей, этот код не эффективен.

Я попытался и не смог сделать что-то вроде от 1 до 20, сделать это и создать все таблицы.

Есть какой-либо способ сделать это?

1 ответ

Решение

Я думаю, что вы ищете средства производства. Вы можете перебрать список группирующих переменных (например, lastterm1, lastterm2) с помощью sas-макроса, заменяющего имя выходной таблицы и переменную класса, и должны иметь все необходимое.

Это простой макрос, который сделает это для last_term1 - last_term20. Немного неясно, что именно вы хотите, так что это базовая обобщенная форма.

%macro looper();
%do i = 1 %to 20;
    proc means data=WORK.MAIN_TABLE;
    var somefield1 somefield2;
    class lastterm&i.;
    output out=WORK.LAST_TERM&i.
      mean(somefield1) = MEAN_of_somefield1
      mean(somefield2) = MEAN_of_somefield2;
    run;
%end;
%mend;
%looper();
Другие вопросы по тегам