SAS를 사용하여 변수 출현 횟수를 기반으로 더미 변수 만들기

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

  •  20-12-2019
  •  | 
  •  

문제

ID 출현 횟수를 나타내기 위해 더미 변수 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 이는 newdata가 각 ID에 대한 마지막 관측값만 갖는다는 것을 의미합니다.마지막 관찰에는 ID당 관찰 수의 카운티가 있기 때문에 이를 원합니다.

이 단계에서는 원본 데이터 "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()와 같은 요약 통계가 id로 계산된다는 의미입니다. count(*) 각 ID의 관찰 횟수를 의미합니다. (case when count(*) = 2 then 0 else 1 end) as a 변수 a를 생성합니다.주어진 ID의 개수가 2이면 a는 0의 값을 취하고, 그렇지 않으면 a는 1의 값을 갖습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top