我正在尝试计算出生人数。数据看起来像这样
ID date
101 2016-01-01
101 2016-02-01
101 2016-02-01
102 2015-03-02
102 2016-04-01
103 2016-02-08
所以现在我想根据日期创建一个计数 预期的输出是这样的
ID date count
101 2016-01-01 1
101 2016-02-01 2
101 2016-02-01 2
102 2015-03-02 1
102 2016-04-01 2
103 2016-02-08 1
我试图通过第一个也是最后一个来做,也是来自proc sql的计数,但我在这里遗漏了一些东西。
data temp;
set temp;
by ID DATE notsorted;
if first.date then c=1;
else c+1;
if first.ID then m=1;
else m+1;
run;
答案 0 :(得分:2)
采用原始方法的另一种解决方案
data x;
input id : 3. date : ddmmyy10.;
FORMAT DATE ddmmyy10.;
datalines;
101 01-01-2016
101 02-01-2016
101 02-01-2016
102 03-02-2015
102 04-01-2016
103 02-08-2016
;
run;
data x;
set x;
by ID DATE notsorted;
if first.ID then c=0; /*reset count every time id changes*/
if first.date then c+1; /*raise count when date changes*/
run;
答案 1 :(得分:0)
你绝对需要先使用吗?
我会使用proc freq来实现这个
data have;
infile datalines delimiter='09'x;
input ID $ date $10. ;
datalines;
101 2016-01-01
101 2016-02-01
101 2016-02-01
102 2015-03-02
102 2016-04-01
103 2016-02-08
;run;
proc freq DATA=have NOPRINT;
TABLES ID * date / OUT=want(drop=percent);
run;
创建:
ID date count
101 2016-01-01 1
101 2016-02-01 2
102 2015-03-02 1
102 2016-04-01 1
103 2016-02-08 1
答案 2 :(得分:0)
如果要在datastep中重现COUNT,则必须使用双DOW。数据集是SET两次。第一次按ID和日期计算行数。第二次输出所有行。
data out;
do _n_ = 1 by 1 until (last.date);
set test ;
by ID date;
if first.date then count = 1;
else count + 1;
end;
do _n_ = 1 by 1 until (last.date);
set test ;
by ID date;
output;
end;
run;
答案 3 :(得分:0)
您忘记在数据步骤中添加RETAIN语句。
data temp; set temp; retain c m 0; by ID DATE notsorted; if first.date then c=1; else c+1; if first.ID then m=1; else m+1; run;
答案 4 :(得分:0)
好的,我已经编辑了以前的代码。希望这将满足您的需求。只需确保您的日期变量是数字或日历格式,以便您可以先按ID和日期对表格进行排序。
data want;
set have;
by id date;
if first.date then count=0;
count+1;
run;