在SAS中选择合适的案例时遇到问题
我需要有关SAS代码的帮助。我有一个数据集(test),其中包含变量yearcase和case。Yearcase是一个表示两辆汽车碰撞的变量。Case是一个二进制变量,表示碰撞中涉及的两辆汽车中的每一辆。我想创建一个数据集(test2),它只包括case=1(导致车祸的汽车)和case=0(没有导致车祸的汽车)。我希望每个年检(碰撞对)都有导致碰撞的汽车和没有导致碰撞的汽车。我想排除两辆车都没有造成碰撞(案例=0)或两辆车都造成碰撞(案例=1)的情况(两次机动车碰撞)。我在这里的代码产生以下输出。正如您所看到的,我仍然有一些案例(崩溃),其中要么两个案例都导致了崩溃(case=1),要么两个案例都没有导致崩溃(case=0)。我试图使用标志变量nocase和bothcase,但它不起作用在SAS中选择合适的案例时遇到问题,sas,Sas,我需要有关SAS代码的帮助。我有一个数据集(test),其中包含变量yearcase和case。Yearcase是一个表示两辆汽车碰撞的变量。Case是一个二进制变量,表示碰撞中涉及的两辆汽车中的每一辆。我想创建一个数据集(test2),它只包括case=1(导致车祸的汽车)和case=0(没有导致车祸的汽车)。我希望每个年检(碰撞对)都有导致碰撞的汽车和没有导致碰撞的汽车。我想排除两辆车都没有造成碰撞(案例=0)或两辆车都造成碰撞(案例=1)的情况(两次机动车碰撞)。我在这里的代码产生以下输出
data test2;
set test;
retain nocase bothcase;
by yearcase;
if first.yearcase then case=nocase;
if last.yearcase then case=bothcase;
if bothcase=nocase then output;
run;
proc freq data=test2;
tables yearcase*case/norow nocol nopercent;
run;
Output looks like this:
case
yearcase case= 0 case= 1 Total
201410001 0 2 2
201410007 0 2 2
201410015 2 0 2
201410024 1 1 2
201410031 1 1 2
201410036 0 2 2
我如何确保只有一辆车(案例=1)和另一辆车(案例=0)导致了碰撞的案例(两次机动车碰撞)?我可能需要使用标志变量,但我不确定如何使用。非常感谢您的帮助
感谢您关于未来的数据处理问题,请清楚说明拥有数据集和想要数据集。另外描述变量及其典型值和含义。有了一个好问题,你要么在发帖前自己弄清楚,要么很有可能得到一个好答案 由于您尚未明确说明have(或input)数据集,因此只能从发布的失败处理代码中推断变量。我的假设是有标志变量case和两个case case可能代表了一个case id,但两个case都将该规则剔除 没有输入细节,就没有好的答案 您可能需要一些使用DOW循环的代码,并且每个组只输出一条记录
data want;
do until (last.yearcase);
set have;
by yearcase;
if <condition-1> then counter_1+1; else
if <condition-2> then counter_2_1;
end;
if <counter_1 logic> and <counter_2 logic> then OUTPUT;
run;
需要数据;
直到(去年)为止;
集有;
按年份分类;
如果是,则计数器_1+1;其他的
如果是,则计数器_2_1;
结束;
if和then输出;
跑
有时,在对组中的每个项目应用另一条规则之前,您需要对整个组进行“测量”或“检测”。对于这些情况,可以使用两个相邻的环路
data want;
do _n_ = 1 by 1 until (last.yearcase);
set have;
by yearcase;
if <condition-detection-logic> then <flag> = 1;
end;
do _n_ = 1 to _n_; %* reprocess that same by group through a second input buffer (i.e. set);
set have;
if < <flag> based logic> then <flag-2> = 1;
end;
if <flag-2> then OUTPUT;
run;
需要数据;
do_n_=1乘以1直到(最后一年案例);
集有;
按年份分类;
如果then=1;
结束;
do=1至%*通过第二个输入缓冲区(即set)分组重新处理相同的数据;
集有;
如果<基于逻辑>则=1;
结束;
如果然后输出;
跑
对于未来的数据处理问题,请清楚地说明have数据集和want数据集。另外描述变量及其典型值和含义。有了一个好问题,你要么在发帖前自己弄清楚,要么很有可能得到一个好答案
由于您尚未明确说明have(或input)数据集,因此只能从发布的失败处理代码中推断变量。我的假设是有标志变量case和两个case
case可能代表了一个case id,但两个case都将该规则剔除
没有输入细节,就没有好的答案
您可能需要一些使用DOW循环的代码,并且每个组只输出一条记录
data want;
do until (last.yearcase);
set have;
by yearcase;
if <condition-1> then counter_1+1; else
if <condition-2> then counter_2_1;
end;
if <counter_1 logic> and <counter_2 logic> then OUTPUT;
run;
需要数据;
直到(去年)为止;
集有;
按年份分类;
如果是,则计数器_1+1;其他的
如果是,则计数器_2_1;
结束;
if和then输出;
跑
有时,在对组中的每个项目应用另一条规则之前,您需要对整个组进行“测量”或“检测”。对于这些情况,可以使用两个相邻的环路
data want;
do _n_ = 1 by 1 until (last.yearcase);
set have;
by yearcase;
if <condition-detection-logic> then <flag> = 1;
end;
do _n_ = 1 to _n_; %* reprocess that same by group through a second input buffer (i.e. set);
set have;
if < <flag> based logic> then <flag-2> = 1;
end;
if <flag-2> then OUTPUT;
run;
需要数据;
do_n_=1乘以1直到(最后一年案例);
集有;
按年份分类;
如果then=1;
结束;
do=1至%*通过第二个输入缓冲区(即set)分组重新处理相同的数据;
集有;
如果<基于逻辑>则=1;
结束;
如果然后输出;
跑
感谢您的回复。我的问题一开始没有很好地阐明。但我做了一些编辑,以澄清我拥有的数据集和我想要的数据集。我找到了另一种解决方案:
`proc sort data=test;
by yearcase case;
run;
data test2;
set test;
by yearcase case;
if (case=0 and first.yearcase and last.case)
or (case=1 and last.yearcase and first.case);
run;`
This gives me a dataset test2 that consist of 1 case (case=1) and 1
noncase (case=0) per each YEARCASE.
`proc freq data=test2;
tables yearcase*case/norow nocol nopercent;
run;`
output looks like this:
case
yearcase case= 0 case= 1 Total
201410024 1 1 2
201410031 1 1 2
201410040 1 1 2
201410044 1 1 2
201410051 1 1 2
201410052 1 1 2
我仍然对使用retain语句和/或
将变量标记为之前的初始代码
谢谢你的回复。我的问题一开始没有很好地阐明。但我做了一些编辑,以澄清我拥有的数据集和我想要的数据集。我找到了另一种解决方案:
`proc sort data=test;
by yearcase case;
run;
data test2;
set test;
by yearcase case;
if (case=0 and first.yearcase and last.case)
or (case=1 and last.yearcase and first.case);
run;`
This gives me a dataset test2 that consist of 1 case (case=1) and 1
noncase (case=0) per each YEARCASE.
`proc freq data=test2;
tables yearcase*case/norow nocol nopercent;
run;`
output looks like this:
case
yearcase case= 0 case= 1 Total
201410024 1 1 2
201410031 1 1 2
201410040 1 1 2
201410044 1 1 2
201410051 1 1 2
201410052 1 1 2
我仍然对使用retain语句和/或
将变量标记为之前的初始代码
谢谢请提供您的输入/输出示例。我不太清楚你在问什么。我已经编辑了这篇文章,包括了输出的样本。让我知道这是否合理。Yearcase是一个由成对的case变量组成的变量。我只想创建一个数据集,其中每个yearcase都有一个case和一个nocase(1和1),而不是2个nocase或2个case。我仍然不完全理解您想要什么。请提供示例输入和您想要的输出。我已经澄清了我的问题,并输入了数据集和输出。让我知道我的问题是否有意义。请提供您的输入/输出示例。我不太清楚你在问什么。我已经编辑了这篇文章,包括了输出的样本。让我知道这是否合理。Yearcase是一个由成对的case变量组成的变量。我只想创建一个数据集,其中每个yearcase都有一个case和一个nocase(1和1),而不是2个nocase或2个case。我仍然不完全理解您想要什么。请提供示例输入和您想要的输出t