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。