Функция для суммирования группы на основе идентификатора независимо от идентификатора - PullRequest
0 голосов
/ 24 июня 2019

В настоящее время я пытаюсь написать некоторый код, который проходит через мой набор данных и суммирует каждую группу каждый раз, когда она появляется независимо от всей группы.это то, на что он сейчас похож, против того, что я хочу.Я думал, что это будет просто, но sas 9.3 не поддерживает суммирование по операторам /

    week       ID  var2 ... MinUnits group 
    24jun2019  1    x       5        0          
    01jul2019  1    x       4        1          
    08jul2019  1    x       7        1          
    15jul2019  1    x       2        1
    22jul2019  1    x       0        2          
    29jul2019  1    x       5        2 
    05aug2019  1    x       2        2     
    24jun2019  1    x       9        0          
    01jul2019  2    x       5        1          
    08jul2019  2    x       6        1
    15jul2019  2    x       8        1
    22jul2019  2    x       1        2          
    29jul2019  2    x       5        2
    05aug2019  3    x       3        2

то, что я хочу, чтобы оно показывало

 week       ID  var2 ... MinUnits group  SumMinUnits
    24jun2019  1    x       5        0          5
    01jul2019  1    x       4        1          13
    08jul2019  1    x       7        1          
    15jul2019  1    x       2        1
    22jul2019  1    x       0        2          7
    29jul2019  1    x       5        2 
    05aug2019  1    x       2        2     
    24jun2019  1    x       9        0          9
    01jul2019  2    x       5        1          19
    08jul2019  2    x       6        1
    15jul2019  2    x       8        1
    22jul2019  2    x       1        2          9
    29jul2019  2    x       5        2
    05aug2019  2    x       3        2

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

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

Ответы [ 2 ]

1 голос
/ 24 июня 2019

Вы можете использовать ключевое слово NOTSORTED в операторе BY, используя переменную GROUP для создания групп BY.

data want;
do until (last.group);
  set have ;
  by group notsorted;
  SumMinUnits=sum(SumMinUnits,MinUnits);
end;
do until (last.group);
  set have ;
  by group notsorted;
  output;
end;
run;

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

0 голосов
/ 24 июня 2019

Не будет ли что-то подобное этой работой?Сумма добавляется к каждой записи группы, но в противном случае ваши данные кажутся упорядоченными по идентификатору и группе.

   proc sql;
   create table want as
   select *, sum(minUnits) as total_units
   from have
   group by ID, GROUP;
   quit;
...