Создайте фиктивную переменную на основе количества появлений переменной с помощью SAS.
-
20-12-2019 - |
Вопрос
Я пытаюсь создать фиктивную переменную A, чтобы указать количество появлений идентификатора.Если ID появляется ровно два раза, то A равно 0;если ID встречается более 2 раз, то A равно 1.
Мой желаемый результат выглядит следующим образом:
ID YEAR A
1078 1989 0
1078 1999 0
1161 1969 0
1161 2002 0
1230 1995 0
1230 2002 0
1279 1996 0
1279 2003 0
1447 1993 0
1447 2001 0
1487 1967 1
1487 2008 1
1487 2009 1
1678 1979 0
1678 2002 0
Мой код:
data new data;
set data;
by ID YEAR;
if First.ID then count=0;
count+1;
run;
data newdata;
set newdata;
by ID YEAR count;
if sum(count)=3 then A=0;
if sum(count)>3 then A=1;
run;
Но вывод неправильный.
Решение
Вы не можете использовать sum(count) для суммирования счетчиков по нескольким наблюдениям.Вместо этого вам нужно сначала подсчитать наблюдения, а затем объединить их с исходными данными.
Поэтапное решение данных
data newdata;
set data;
by ID YEAR;
if First.ID then count=0;
count+1;
if last.id then output;
drop year;
run;
if last.id then output
означает, что в новых данных будет только последнее наблюдение для каждого идентификатора.Мы хотим этого, потому что последнее наблюдение имеет количество наблюдений на идентификатор.
На этом этапе исходные данные «data» объединяются со значениями из «newdata» и вычисляется a.
data newdata2;
merge data newdata;
by ID;
if count=2 then A=0;
if count>2 then A=1;
drop count;
run;
решение proc sqlВы можете сделать это еще быстрее с помощью proc sql:
proc sql;
create table newdata as
select id, year, (case when count(*) = 2 then 0 else 1 end) as a
from data
group by id;
quit;
group by id
означает, что сводная статистика, такая как count(), рассчитывается по идентификатору, поэтому count(*)
означает подсчет наблюдений в каждом идентификаторе. (case when count(*) = 2 then 0 else 1 end) as a
создает переменную a.Если счетчик для данного идентификатора равен 2, то a принимает значение 0, в противном случае a принимает значение 1.