无法在SAS中选择​​适当的案例

时间:2017-10-10 20:26:09

标签: sas

我的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)的汽车(双机动车碰撞)?我可能需要使用标志变量..但我不确定如何。任何帮助是极大的赞赏。

谢谢

2 个答案:

答案 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语句和/或替代方法感到好奇 标记变量,如我之前的初始代码。

谢谢