SAS中的第一个和最后一个陈述

时间:2016-06-23 08:19:07

标签: sas

我正在尝试计算出生人数。数据看起来像这样

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;

5 个答案:

答案 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;

产生
 enter image description here

答案 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;