我对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宏。
先谢谢!!
答案 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步骤中。
最后一部分,总和,应该是不言自明的。
希望这会有所帮助。