我的SAS代码需要帮助。我有一个包含变量yearcase和case的数据集(test)。 Yearcase是一个变量,表示双机动车碰撞.Case是一个二进制变量,表示碰撞中涉及的两辆汽车中的每一辆。我想创建一个仅包含case = 1(导致崩溃的汽车)和case = 0(不会导致崩溃的汽车)的数据集(test2)。我希望每个年份(碰撞对)都有导致碰撞的汽车和没有导致碰撞的汽车。我想排除一些车辆(2机动车碰撞),其中两辆车都没有造成车祸(案件= 0)或两辆车都造成了车祸(案件= 1)。我的代码在这里产生以下输出。正如您所看到的,我仍然有一些年份(崩溃),其中两种情况都导致崩溃(case = 1)或两种情况都没有导致崩溃(case = 0)。我试图使用标志变量nocase和bothcase但它不起作用。
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辆汽车导致碰撞(案件= 1)而另一辆没有(案件= 0)的汽车(双机动车碰撞)?我可能需要使用标志变量..但我不确定如何。任何帮助是极大的赞赏。
谢谢
答案 0 :(得分:0)
对于将来的数据处理问题,请清楚说明有数据集和想要数据集。另外描述变量,它们的典型值和含义。有了一个好问题,您可以在发布之前自己弄明白,或者很有可能获得好的答案。
由于您还没有明确表示有(或输入)数据集,因此只能从发布的失败处理代码中推断出变量。我的假设是有标志变量 case 和 bothcase 。
案例可能代表了一个案例ID,但是 bothcase 会敲除这个案例。
没有输入细节,没有好的答案。
您可能需要一些使用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;
有时你需要测量&#39;或者&#39;检测&#39;在对组中的每个项目应用另一个规则之前,对整个组进行完整处理。对于这些情况,可以使用两个相邻的循环。
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;
答案 1 :(得分:0)
感谢您的所有回复。我的问题最初没有明确表达。但是我做了一些修改来澄清我拥有和想要的数据集。我找到了另一种解决方案:
`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语句和/或替代方法感到好奇 标记变量,如我之前的初始代码。
谢谢