SAS宏在数据中缺少日期的日期范围之间进行平均

时间:2014-02-17 12:29:08

标签: sas

我对SAS及其宏完全陌生。我有这个名为mydata的数据集:

Obs SYMBOL  DATE    kx  y
1   A   20120128    5   6
2   B   20120128    10  7
3   C   20120128    20  9
4   D   20120128    6   10
5   E   20120128    9   20

我的问题是找到这个功能:

Newi = ∑ j€[-10,-2]  (x+y)i,j /N, 

其中,

i = any random date(user defined)

-10 and -2(10 days or 2 days before i)

N= total number of days with data available for (x+y) between (-10,-2)

可用数据中可能缺少日期。

任何人都可以帮助我解决以下问题的可能的SAS宏。

先谢谢!!

1 个答案:

答案 0 :(得分:0)

我假设您的日期数据存储为日期,并且可以接受数值计算。我还假设您想要在d附近的特定日期获得X和Y的平均值,其中d是用户定义的。最后,我假设如果你在同一天有两个独特的id,你可以随意保留第一个id。显然,这些假设可能需要稍微调整一下,但从我相信你的要求(我承认我只是确定我理解你的问题),希望这足够接近你所需要的,你可以调整很容易休息。

好了...

 PROC SORT DATA in;
 BY date uniqueid;
 RUN;

%MACRO summarize( userdate );

DATA out;
SET in (where = (date >= &userdate -10 and date <= &userdate - 2);
BY date uniqueid;
xy = sum(x, y)
IF first.uniqueid;
RUN;

PROC SUMMARY DATA = out; 
OUTPUT OUT = Averages&userdate MEAN(xy) = ;
RUN;
%MEND summarize;

%summarize('20120128'd); 

这里发生了什么?好吧,我先按日期和uniqueid对数据进行排序。我可以使用NODUPKEY,但我想你可能想要控制如何处理给定日期的重复唯一性。数据集通过保留它遇到的第一个来丢弃重复数据,但您可以修改重复数据删除逻辑(它来自DATA步骤中的BY命令和同一个IF优先命令。)

您需要围绕特定用户定义日期的一组日期,d。所以得到d并用WHERE过滤数据集。您也可以在PROC SORT步骤中执行此操作,如果您的原始数据经常更新,可能有理由这样做。如果您不是每次用户定义日期范围时都不需要运行排序,请将其保留在宏外部并仅在需要时运行它。排序可能很慢。

在数据步骤中,我得到总和(x,y)来说明x或y可能缺失的事实,或者两者兼而有之,或者两者都没有。在这些情况下,x + y将丢失。我认为现在你想要的是,但请记住,我们将平均输出和(x,y)超过N,其中N是&#34; x或y都没有丢失。 &#34;如果要完全忽略这些行,请使用x + y并添加IF xy!=。在您的DATA步骤中。

最后一部分,总和,应该是不言自明的。

希望这会有所帮助。