Получение самого настоящего класса по группам в SAS - PullRequest
0 голосов
/ 14 марта 2019

У меня есть набор данных в SAS, скажем: ID, класс, группа

Существует 4 значения для группы: {1,2,3,4} и неопределенное число класса {Class1, ..., Class n}.

Какой самый быстрый способ найти самый представительный класс для каждой группы?

Я вижу два варианта: Proc freq или что-то вроде

proq sql; 
Select count(*)
From Have
group by group, class; 

И после взятия максимума каждой группы. Но я не уверен, как финиш ..

EDIT

Я сказал самое быстрое, но это больше об эффективности, я работаю над большим столом на 10 миллионов строк и очень часто запускаю его

1 Ответ

2 голосов
/ 14 марта 2019

Следующий пошаговый подход - это один метод:

data have;
   input group :      8.
         class : $char8.
   ;

   datalines;
1 class1
1 class1
1 class2
1 class3
2 class2
2 class2
2 class2
2 class3
3 class1
3 class2
3 class3
3 class3
;

/* get frequencies */
proc freq data = have noprint;
   tables group*class / out=tmp_freq;
run;

proc sort data = tmp_freq;
   by group count;
run;

data want;
   set tmp_freq;
   by group count;

   if last.group;
run;

И в результате получается

Group     Class   Count    Percent
    1    class1       2       16.6
    2    class2       3         25
    3    class3       2       16.6

Изменить в ответ на вопрос в комментариях:

В последней таблице проценты взяты из целых данных. Как вы думаете, мы можем получить их по классам?

data want2(keep = group class max_count percent_for_group);
   /* process data by group */
   do until(last.group);
      set tmp_freq;
      by group;

      if count gt max_count then
         max_count = count;

      sum_count = sum(sum_count,count);
   end;

   percent_for_group = max_count * 100 / sum_count;
run;
...