0

I am trying to create a dummy variable A to indicate the number of ID appearances. If ID appears exactly twice, then A equals 0; if ID appears more than 2 times, then A equals 1.

My desired output is as follows:

  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

My code is:

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;

But the output is incorrect.

4

1 回答 1

1

您不能使用 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(*)mean 计算每个 id 中的观察值。(case when count(*) = 2 then 0 else 1 end) as a创建一个变量 a。如果给定 id 的计数为 2,则 a 取值为 0,否则 a 取值为 1。

于 2014-07-28T22:08:55.157 回答