复杂任务,LAG和RETAIN功能可能不够好

时间:2013-12-12 11:43:51

标签: sas

可能是我遇到的最复杂的任务。 真的可以在这里使用你的帮助......

假设我有一个与此类似的数据集:

data have;
rk = 1;
version = 0;
treatment_ind = 1;
start_date_1 = "01jan2013"d;
end_date_1 = "01feb2013"d;
start_date_2 = "21jan2013"d;
end_date_2 = "18feb2013"d;
money_field = 32;
OUTPUT;

rk = 1;
version = 1;
treatment_ind = 1;
start_date_1 = "01feb2013"d;
end_date_1 = "01apr2013"d;
start_date_2 = "3jan2013"d;
end_date_2 = "9feb2013"d;
money_field = 1;
OUTPUT;

rk = 1;
version = 2; 
treatment_ind = 2;
start_date_1 = "01jan2013"d;
end_date_1 = "01feb2013"d;
start_date_2 = "21jan2013"d;
end_date_2 = "18feb2013"d;
money_field = 65;
OUTPUT;

rk = 1;
version = 3;
treatment_ind = 3;
start_date_1 = "01jan2013"d;
end_date_1 = "01jun2013"d;
start_date_2 = "21jul2013"d;
end_date_2 = "18aug2013"d;
money_field = 6;
OUTPUT;

rk = 1;
version = 0;
treatment_ind = 7;
start_date_1 = "11mar2013"d;
end_date_1 = "22may2013"d;
start_date_2 = "21feb2013"d;
end_date_2 = "24feb2013"d;
money_field = 34;
OUTPUT;



FORMAT start_date_1 end_date_1 start_date_2 end_date_2 DATE9.;
run;

如果treatment_ind = 1 - 这很容易。一个常规案例,所有计算对我来说都很合适。

下面比较棘手:

如果treatment_ind = 2, 我需要做一些事情:

  1. 首先,更简单的任务:更新现有行中的少数字段(其中treatment_ind = 2)

  2. 每个rk在某个地方拥有一个treatment_ind = 2,应该以某种方式行事。

  3. 如果treatment_ind = 3,

    1. 首先,更简单的任务:更新现有行中的少数字段(其中treatment_ind = 3)

    2. 每个rk在某个地方拥有一个treatment_ind = 3,应该以某种方式行事。不同的方式。

    3. 依旧...... 我有8种不同的指标,它们以不同的方式起作用,而不仅仅是当前行, 但RK每一行都拥有该指标......

      其中一些实际上取消了其他指标的行为。 例如, 如果某个RK的某个地方有一个Indicator_ind = 7, 不应该计算出treatment_ind = 3。

      完成所有这些后, 我应该使用Retain来累积从一行到另一行的数字......

      主要问题是, 我无法上传我工作的表格来更好地解释我所面临的情况, 我上传的数据集非常简单,并不代表该任务的复杂性......

      例如, indicator_ind = 1,那么日期之间的差异应该根据第一组日期。 在其他指标中,应根据第二组计算。

      同样适用于许多其他计算...

      我知道回答这个问题可能很难......

      但是,首先,我要求一个方向...... 因为单靠保留/滞后对我没有帮助,我害怕...

1 个答案:

答案 0 :(得分:0)

这可能会帮助您解决问题,但由于我无法看到您的数据集,因此很难预测。您可以使用RETURN和SELECT语句。 RETURN跳过当前数据步骤迭代并继续下一次迭代。 SELECT的工作方式类似于其他编程语言中的“switch”语句。一旦条件满足,它将只执行该条件的后续语句。

data work.test;
set work.sample;
if indicator_ind=7 and treatment_ind=3 then return;



select; 
    when(treatment_ind = 1 and version = 0) do;

    rk = 1;
    start_date_1 = "01jan2013"d;
    end_date_1 = "01feb2013"d;
    start_date_2 = "21jan2013"d;
    end_date_2 = "18feb2013"d;
    money_field = 32;
    OUTPUT;
    end;

    when(treatment_ind = 1 and version = 1) do;

    rk = 1;
    start_date_1 = "01feb2013"d;
    end_date_1 = "01apr2013"d;
    start_date_2 = "3jan2013"d;
    end_date_2 = "9feb2013"d;
    money_field = 1;
    OUTPUT;
    end;

    when(treatment_ind = 2 and version = 2) do;

    rk = 1;
    start_date_1 = "01jan2013"d;
    end_date_1 = "01feb2013"d;
    start_date_2 = "21jan2013"d;
    end_date_2 = "18feb2013"d;
    money_field = 65;
    OUTPUT;
    end; 


    when(treatment_ind = 3 and version = 3) do;

    rk = 1;
    start_date_1 = "01jan2013"d;
    end_date_1 = "01jun2013"d;
    start_date_2 = "21jul2013"d;
    end_date_2 = "18aug2013"d;
    money_field = 6;
    OUTPUT;
    end;

    when(treatment_ind = 7 and version = 0) do;

    rk = 1;
    start_date_1 = "11mar2013"d;
    end_date_1 = "22may2013"d;
    start_date_2 = "21feb2013"d;
    end_date_2 = "24feb2013"d;
    money_field = 34;
    OUTPUT;
    end;

    otherwise;
end;

FORMAT start_date_1 end_date_1 start_date_2 end_date_2 DATE9.;
run;