复杂的Task、LAG和RETAIN函数可能不够好



可能是我遇到的最复杂的任务。真的需要你的帮助。。。

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

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,应该以某种方式行事。

如果treatment_ind=3,

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

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

等等。。。。我有8个不同的指标,它们以不同的方式起作用,不仅仅是针对当前行,但RK的每一行都在某个地方拥有指示器。。。

其中一些实际上取消了其他指标的行为。例如如果某个RK在某处具有Indicator_ ind=7,则不应计算treatment_ind=3。

当所有这些都完成时,我应该使用Retain将数字从一行累积到另一行。。。

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

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

很多其他计算也是如此。。。

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

但是,首先,我在问一个方向。。。因为我担心,仅仅保留/滞后对我没有帮助。。。

这可能会帮助您解决问题,但由于我看不到您的数据集,因此很难预测。您可以随意使用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;

最新更新