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宏吗。

提前感谢!!

我假设您的日期数据存储为日期,并且可以接受数字计算。我还假设您希望获得d前后特定日期的X和Y的平均值,其中d是用户定义的。最后,我假设如果你在同一天有两个唯一的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,但我想你可能想控制如何处理给定日期的重复uniqueid。数据集通过保留它遇到的第一个重复数据消除重复数据,但您可以修改重复数据消除逻辑(它来自DATA步骤中的by命令和同一步骤中的IF first.命令)。

您想要一组围绕特定用户定义日期d的日期。因此,获取d并使用WHERE过滤数据集。您也可以在PROC SORT步骤中执行此操作,如果您的原始数据将频繁更新,则可能有这样做的原因。如果不需要每次用户定义日期范围时都运行排序,请将其保留在宏之外,只在需要时运行。排序可能很慢。

在数据步骤中,我得到sum(x,y),以说明x或y可能缺失,或者两者都缺失,或者二者都不缺失。在这些情况下,x+y将返回丢失。我想这就是你现在想要的,但请记住,我们将在N上求和(x,y)的平均值,其中N是"x或y不缺失"。如果你想完全忽略这些行,请使用x+y并添加If xy!=。在您的DATA步骤中。

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

希望这能有所帮助。

最新更新