可能是我遇到的最复杂的任务。 真的可以在这里使用你的帮助......
假设我有一个与此类似的数据集:
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,那么日期之间的差异应该根据第一组日期。 在其他指标中,应根据第二组计算。
同样适用于许多其他计算...
我知道回答这个问题可能很难......
但是,首先,我要求一个方向...... 因为单靠保留/滞后对我没有帮助,我害怕...
答案 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;