1

我有一个包含 500 个股票代码的 Excel 文件。我希望从一个大的 SAS 数据集中提取每只股票的回报和额外的观察结果。之前,比如说 20 个股票代码,我会执行以下操作:

data s1 s2 s3 s4 s5 s6 s7 s8 s9 s10 s11 s12 s13 s14 s15 s16 s17 s18 s19 s20;

set tick;
if stock='DIS' then output s1;
if stock='AA' then output s2; 
if stock='QCOM' then output s3; 
if stock='FB' then output s4; 
if stock='AMGN' then output s5;
if stock='AMZN' then output s6; 
if stock='AXP' then output s7; 
if stock='NWS' then output s8; 
if stock='INTC' then output s9; 
if stock='KRFT' then output s10;
if stock='CB' then output s11; 
if stock='CELG' then output s12; 
if stock='CMCSA' then output s13; 
if stock='COST' then  output s14; 
if stock='CSCO' then output s15;
if stock='YHOO' then output s16; 
if stock='DELL' then output s17; 
if stock='VOD' then output s18; 
if stock='DOW' then output s19; 
if stock='EBAY' then output s20;
run;

其中tickSAS 数据集包含全部股票收益。

然后对于每个 s1, s2....s20,我使用一个循环在 20 个不同的文件之间进行迭代,并应用一些额外的 SAS 代码。

if stock='COST' then output s14;如果我需要在每个股票代码上应用一系列 SAS 代码,我想避免用 500 行填充我的 SAS 代码。

有没有办法让 SAS 循环遍历我的 excel 文件的每一行,比如说它选择第一个代码,创建一个 SAS 数据集,s1然后我将一些 SAS 代码应用到这个s1文件,一旦完成,回到循环顶部,选择我的 excel 的第二行(因此是第二个代码)并重复该过程?

4

2 回答 2

2

正如 Dom 所说,最好的解决方案是使用一个数据集和 BY 组来执行此操作。

第二个最好的解决方案是像这样编写你已经存在的宏:

%macro dostuff(stock=);
data mystuff/view=mystuff;
set tick;
where stock="&stock.";
run;

... do stuff ...
%mend;

这将创建一个视图,然后您可以将其用于下游处理,而无需创建物理数据集 - 它允许您按需创建它,而不是预先创建数据集。如果您在tick上正确索引数据集stock,它应该与创建多个数据集一样快或更快,即使它是一个多通道解决方案(因为它是一个视图)。

-乔

于 2013-09-04T13:51:26.020 回答
2

首先,您最好将事物留在一个数据集中并按组使用来进行下游处理。

如果必须,您可以使用如下宏编写脚本:

%macro split();
proc sql noprint;
select count(distinct stock)
    into :n
    from tick;

select distinct stock
    into :s1 - :s%left(&n)
    from tick;
quit;

data
    %do i=1 %to &n;
    s&i
    %end;
;
set tick;

%do i=1 %to &n;
   if stock = "&&s&i" then output s&i;
%end;
run;
%mend;

%split();
于 2013-09-04T01:11:51.753 回答