题
我正在尝试创建一个虚拟变量 A 来指示 ID 出现的次数。如果 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;
过程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。
不隶属于 StackOverflow