Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/url/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
SAS中的第一个和最后一个语句_Sas - Fatal编程技术网

SAS中的第一个和最后一个语句

SAS中的第一个和最后一个语句,sas,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

我正试图计算出生人数。数据看起来是这样的

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
我试图通过第一个和最后一个以及procsql的计数来完成这项工作,但我在这里遗漏了一些东西

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;

你一定要先用吗

我将使用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

你一定要先用吗

我将使用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

如果要在数据步骤中重现计数,则必须使用双道指数。数据集设置两次。第一次按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;

如果要在数据步骤中重现计数,则必须使用双道指数。数据集设置两次。第一次按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;

您忘记在数据步骤中添加RETAIN语句


您忘记在数据步骤中添加RETAIN语句


使用原始方法的另一个解决方案

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;
产生

使用您的原始方法的另一种解决方案

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;
产生

好的,我已经编辑了前面的代码。希望这能满足你的需要。只需确保您的日期变量是数字或日历格式,以便您可以先按ID和日期对表进行排序

data want;
set have;
by id date;

if first.date then count=0;
count+1;

run;

好的,我已经编辑了前面的代码。希望这能满足你的需要。只需确保您的日期变量是数字或日历格式,以便您可以先按ID和日期对表进行排序

data want;
set have;
by id date;

if first.date then count=0;
count+1;

run;

请解释你的输出表。我不明白你的计数变量背后的逻辑。如果它应该是按ID和日期计数,那么最后两行是错误的。嘿,哦,是的,很抱歉输入错误,我现在更正了它。请解释您的输出表。我不明白你的计数变量背后的逻辑。如果应该是按ID和日期计数,那么最后两行是错误的。嘿,哦,是的,抱歉输入错误,我现在更正了。嗨,我做了同样的事情,但主要的问题是,如果是第二次交付的身份证,并且第二次交付时有三胞胎,那么这就错了。交付的顺序或数量应该是2,而不是3。我做了同样的事情,但是主要的问题是,如果它是第二次传递的ID,并且在第二次传递中有三元组,那么这就错了。传递的顺序或数量应该是2而不是3。使用sum语句(c+1)时不需要显式RETAIN。使用sum语句(c+1)时不需要显式RETAIN。