可能是我遇到的最复杂的任务。真的需要你的帮助。。。
假设我有一个类似的数据集:
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,我需要做几件事:
首先,更简单的任务是:更新现有行中的几个字段(其中treatment_ind=2)
每个rk在某个地方拥有一个treatment_ind=2,应该以某种方式行事。
如果treatment_ind=3,
首先,更简单的任务是:更新现有行中的几个字段(其中treatment_ind=3)
每个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;