У меня есть структура данных, которая выглядит следующим образом:
DATA have ;
INPUT famid indid implicate imp_inc;
CARDS ;
1 1 1 40000
1 1 2 25000
1 1 3 34000
1 1 4 23555
1 1 5 49850
1 2 1 1000
1 2 2 2000
1 2 3 3000
1 2 4 4000
1 2 5 5000
1 3 1 .
1 3 2 .
1 3 3 .
1 3 4 .
1 3 5 .
2 1 1 40000
2 1 2 45000
2 1 3 50000
2 1 4 34000
2 1 5 23500
2 2 1 .
2 2 2 .
2 2 3 .
2 2 4 .
2 2 5 .
2 3 1 41000
2 3 2 39000
2 3 3 24000
2 3 4 32000
2 3 5 53000
RUN ;
Итак, у нас есть семейный идентификатор, индивидуальный идентификатор, номер участника и вмененный доход для каждого участника.
Что мне нужно, так это скопировать результаты первого индивида в каждой семье (все пять вариантов) для оставшихся индивидов в каждой семье, заменив любые значения, которые мы ранее имели в этих ячейках, например:
DATA want ;
INPUT famid indid implicate imp_inc;
CARDS ;
1 1 1 40000
1 1 2 25000
1 1 3 34000
1 1 4 23555
1 1 5 49850
1 2 1 40000
1 2 2 25000
1 2 3 34000
1 2 4 23555
1 2 5 49850
1 3 1 40000
1 3 2 25000
1 3 3 34000
1 3 4 23555
1 3 5 49850
2 1 1 40000
2 1 2 45000
2 1 3 50000
2 1 4 34000
2 1 5 23500
2 2 1 40000
2 2 2 45000
2 2 3 50000
2 2 4 34000
2 2 5 23500
2 3 1 40000
2 3 2 45000
2 3 3 50000
2 3 4 34000
2 3 5 23500
RUN ;
В этом примере я пытаюсь реплицировать только одну переменную, но в моем проекте мне придется сделать это для десятков переменных.
Пока я придумал это решение:
%let implist_1=imp_inc;
%macro copyv1(list);
%let nwords=%sysfunc(countw(&list));
%do i=1 %to &nwords;
%let varl=%scan(&list, &i);
proc means data=have max noprint;
var &varl;
by famid implicate;
where indid=1;
OUTPUT OUT=copy max=max_&varl;
run;
data want;
set have;
drop &varl;
run;
data want (drop=_TYPE_ _FREQ_);
merge want copy;
by famid implicate;
rename max_&varl=&varl;
run;
%end;
%mend;
%copyv1(&imp_list1);
Это хорошо работает для одной или двух переменных. Однако, если вы сделаете это для 400 переменных в наборе данных размером 1,5 ГБ, это будет чрезвычайно медленным.
Я почти уверен, что есть более быстрый способ сделать это с какой-либо формой proc sql или first.var и т. Д., Но я относительно новичок в SAS и до сих пор не смог придумать лучшего решения .
Большое спасибо за вашу поддержку.
С наилучшими пожеланиями