Создайте фиктивную переменную на основе количества появлений переменной с помощью SAS.

StackOverflow https://stackoverflow.com//questions/25004053

  •  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.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top