SAS proq SQL: условное суммирование и свертывание строк - PullRequest
0 голосов
/ 24 октября 2018

В SAS, как условно свернуть строки, заменив одну строку с явно заданным именем, представляющую сумму значений?

В частности, я хочу создать таблицу частот, которая отображает частоты значений Подкласс, но при условии, что эта частота> 9.В любом другом случае (частота <10) я хочу, чтобы частота учитывалась как сумма частот, ограниченная значением <em>Класс .В наборе данных отсутствуют пропущенные или нулевые значения.

Freq   Class  Subclass 
---------------------
20     1      1a        
20     1      1b       
 2     1      1c  
 2     1      1d
 2     1      1e
 1     1      1f
22     2      2a       
 6     2      2b        
 2     2      2c
 1     2      2d
31     3      3a        
17     3      3b        
 7     3      3c
 3     3      3d  
 3     3      3e        

Мой текущий подход создал первую таблицу, используя:

proc sql;
   create table as
   select* count (distinct subjectID) as count
   from DATASET1 
   group by Subclass
   ; 
run; quit;

Желаемый результат будет выглядеть примерно так:

Freq   Class  Subclass 
---------------------
20     1      1a        
20     1      1b       
 7     1      OTHER (1c, 1d, 1e, 1f) 
22     2      2a       
 9     2      OTHER (2b, 2c, 2d)        
31     3      3a        
17     3      3b        
13     3      OTHER (3c, 3d, 3e)     

ПредпочтительноЯ хотел бы дополнительно явно указать значение Subclass , представляющее суммированное измерение в соответствии с идентификаторами измерений, представленных в строках.В этом примере это будут имена суммированных подклассов.

Я пытался использовать процедуру Proc means, которая выдает новый набор данных всех Subclasses с частотой <10, а не суммарное значение.</p>

Ответы [ 2 ]

0 голосов
/ 24 октября 2018

Шаг данных - это способ получить желаемый результат, используя операторы first. и last..Это дает вам возможность вывести значения> 9 или суммировать другие значения в том же классе.

Функция call catx объединит значения подкласса, чтобы вы могли видеть, какие из них составляют частоту.

data have;
input Freq Class Subclass $;
datalines;
20     1      1a
20     1      1b
2     1      1c
2     1      1d
2     1      1e
1     1      1f
22     2      2a
6     2      2b
2     2      2c
1     2      2d
31     3      3a
17     3      3b
7     3      3c
3     3      3d
3     3      3e
;
run;

data want;
set have;
by class;
length subclass_groups $20 subclass_temp $20;
retain subclass_temp;
if first.class then call missing(freq_temp,subclass_temp);
if freq>9 then do;
    subclass_groups = subclass;
    output;
end;
else do;
    freq_temp + freq;
    call catx(',',subclass_temp,subclass);
end;
if last.class then do;
    freq = freq_temp;
    subclass_groups = subclass_temp;
    output;
end;
drop subclass subclass_temp freq_temp;
run;
0 голосов
/ 24 октября 2018

не протестированный код, и это поможет понять, как решить проблему с помощью union.

 proc sql;
create table as
select freq, class, subclass, count(subclass) as count
from DATASET1 
 where freq le 9
group by Subclass
union  all
select freq, class, subclass, count(class) as count
from DATASET1 
where freq ge 10
group by class;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...