修改数据集以扩展时间范围



很抱歉标题令人困惑。

背景

数据如下所示

Area Date Ind LB UB
A    1mar 14  1  20
A    2mar 3   1  20
B    1mar 11  7  22
B    2mar 0   7  22

面积具有多个不同的值。对于每个区域,LBUB在多个日期中是固定的,而Ind则有所不同。 Date总是从月初开始到每月的某一天。

目标

我的目标是为每个区域运行一个控制图,以查看Ind是否超出(LB,UB)的范围。

但是,如果我只绘制每个区域的原始数据,则默认情况下xaxis不会在当月的最后一天结束(在前面的示例中,绘图将从 3 月 1 日到 3 月 2 日,而不是 3 月 31 日。我确实知道通过指定xmax选项xaxis该图将扩展到 3 月 31 日。但这只会扩展xaxisLBUB仍然显示从 3 月 1 日到 3 月 2 日,使图表的右侧留空。

因此,我使用modify添加一些日期记录。

我做了什么

data have;
modify have;
do i = 0 to intck('day',today(),intnx('month',today(),0,'E'));
Date = today()+i;
call missing(Ind);
output;
end;
stop;
run;
proc sgplot data=have missing;
series ... Ind ...;
series ... LB ...;
series ... UB ...;
run;

问题

但这仅适用于一个区域。我需要先修改每个区域,然后逐个绘制它们。我怎样才能相对高效地获得以下数据

Area Date Ind LB UB
A    1mar 14  1  20
A    2mar 3   1  20
A    3mar .   1  20
....
A    31mar.   1  20
B    1mar 11  7  22
B    2mar 0   7  22
B    3mar .   7  22
....
B    31mar.   7  22

或者proc sgplot还有其他选择可以解决这个问题?

您可以将

proc timeseries与按组area一起使用,以将其转换为所需的形式。end=选项将允许您指定数据的结束日期。看起来您使用的是当前月份,因此我们将采用您的intnx函数并将其放入一组解析为日期文本的宏函数中(由于某种原因,大多数 ETS 过程都需要日期文本)。

我们将使用两个var语句:一个用于ind,其中我们用.填充未观察到的值,另一个用于LB&UB,以使用以前的有效值设置其未观察到的值。

请注意,我们假设你已将date放入 SAS 日期。请确保在运行以下代码之前先执行此操作。

proc timeseries data=have
                out=want;
   by area;
   id Date interval=day notsorted 
           accumulate=none
           end="%sysfunc(intnx(month, %sysfunc(today() ), 0, E), date9.)"d;
   var Ind / setmissing=missing;
   var LB UB / setmissing=previous;
run;

最终数据集的外观将完全符合您的要求。

最新更新