我有: 6个文件,命名如下:" ROSTER2008"," ROSTER2009",...," ROSTER2013" 每个文件都有以下变量:TEAMID和MATE1,MATE2,...,MATEX。队友的名字存储在每个团队中,直到队友X.
现在:我想循环读取6个文件的代码并使用TEAM,MATES2008,MATES2009,...,MATES2013创建一个输出文件,其中MATES20XX变量包含各个团队中各个队友的数量一年(我不再关心他们的名字)。
以下是我尝试过的事情:
%macro sqlloop(start, end);
proc sql;
%DO year=&start. %TO &end.;
create table mates_by_team_&year. as
select distinct put(teamID, z2.) as team,
count(*) as mates
from myLibrary.rosters
where d='ROSTER(HOW DO I PUT YEAR HERE?)'.d;
%end;
quit;
%mend;
%sqlloop(start=2008, end=2013)
所以,这是我的问题:
如何修复'其中'语句使它理解我打算在每次迭代时引入的文件名? (那是ROSTER2008,......,ROSTER2013)
现在,我为我输入的每个文件创建了6个不同的表。相反,如何将这些文件连接到一个表中,如上所述?
提前感谢您的帮助!
Xtina
答案 0 :(得分:2)
为了简单起见,我假设您 MATEX 中的 X 永远不会超过999.显然您可以增加限制,或者您可以使用 proc内容或字典表,以找出最大限制。
我已将数据中的所有变量Mate1:MateX拉出来并检查它们是否缺失,并增加计数器以计算团队成员的数量。
%macro loops(start=,end=);
%do year=&start. %to &end.;
data year_&year.(keep=teamid Mates_&year.);
set roster&year.;
array mates{*} mate1-mate999;
Mates_&year.=0;
do i=1 to 999;
if not missing(mates{i}) then Mates_&year.=Mates_&year.+1;
end;
run;
proc sort data=year_&year.;
by teamid;
%end;
最后,我将所有数据集合并在一起。
data team;
merge year_&start.-year_&end.;
by teamid;
run;
%mend;
%loops(start=2008,end=2009);
答案 1 :(得分:0)
假设这些是SAS数据集,而您使用的是SAS 9.3+,我建议使用数据步骤和proc freq方法。它更容易理解。如果你想让它成为一个宏,用宏变量取代年份(2008/2012)。
编辑:添加N()以计算队友的数量,假设它遵循mate1 mate2 ... matex。 单个datastep可以得到答案,您可以删除变量。
Data combined;
Set roster2008 - roster2012 indsname=source;
Year = substr(scan(source, 2, '.'), 7);
Num_mates = n(of mate:);
*drop mate:;
Run;
PROC sort data=combined;
By teamid year;
Run;
PROC transpose data=combined out=want prefix=mate;
By teamid;
VAR num_mates;
Id year;
Run;
*OLD CODE BASED ON SQL SOLUTION;
*Proc freq data=combined;
*Table dsn*teamid/list;
*Run;