Как суммировать значения по группе, а затем назначать результат каждому человеку в группе в SAS - PullRequest
0 голосов
/ 14 января 2019

У меня есть уникальные группы, состоящие из 2 или 3 человек. У каждого человека есть значение для переменной X (или отсутствует). Для каждой группы я хочу суммировать значения для всех наблюдений в этой группе И присваивать результат каждому человеку в группе.

набор данных выглядит следующим образом

group ID X<br> 1 110 2.5 1 111 1.0 1 112 0.0 2 210 . 2 211 5.6 3 212 2.0 3 213 1.5 4 310 . 4 311 7.2 4 312 2.1

И набор данных, который я хочу с новой переменной Y, выглядит следующим образом:

group ID X Y 1 110 2.5 3.5 1 111 1.0 3.5 1 112 0.0 3.5 2 210 . 5.6 2 211 5.6 5.6 3 212 2.0 3.5 3 213 1.5 3.5 4 310 . 9.3 4 311 7.2 9.3 4 312 2.1 9.3

Спасибо за вашу помощь

Ответы [ 3 ]

0 голосов
/ 14 января 2019

, если ваши данные уже отсортированы по решению цикла Dow и означают, что за ним следует решение слияния, как предложено @Richard в комментариях.

  /*DOW LOOP solution*/

   data want;
 do until(last.group);
 set have;
 by group;
if first.group then Y=X;
 else Y+X;
  end;
 do until(last.group);
   set have;
 by group;
output;
end;
run;

/* mean followed by merge solution*/
proc means data = have nway noprint;
class group;
var X;
output out=have1 ( keep = Group Y) sum=Y;
 run;



data want;
merge have have1;
by group;
run;
0 голосов
/ 14 января 2019

@ Киран, ваше кодирование последовательного do … until с last.group в качестве условия завершения не работает, поскольку состояние last.group=1 сохраняется, несмотря на set;by; во втором цикле, и, следовательно, второй цикл повторяется только один раз.

Лучшим решением, о котором долго говорил Дорфман, является шаблон размера группы вычислений первого цикла с 1 by 1, за которым следует второй цикл с явным циклом 1 to _n_

data have; input
group ID     X; datalines;
1     110     2.5
1     111     1.0
1     112     0.0
2     210     .
2     211     5.6
3     212     2.0
3     213     1.5
4     310     .
4     311     7.2
4     312     2.1
run;

data want;
  do _n_ = 1 by 1 until (last.group);
    set have;
    by group;
    groupsum = sum(groupsum,x);
  end;

  do _n_ = 1 to _n_ ;
    set have;
    output;  * group related computation result gets carried into the output data set (want);
  end;
run;

Часть шаблона do _n_ = 1 to _n_ становится более понятной, когда кодер понимает, что шаг данных SAS оценивает значения start , stop и на для предшествующего цикла на самом деле итерации цикла.

0 голосов
/ 14 января 2019

Предполагается, что ваша таблица называется "ds":

PROC SQL;
    SELECT group, ID, x, sum(x) AS y
    FROM DS
    GROUP BY group;
QUIT;
...