我正致力于从多对多合并中创建三个数据集。我知道我需要从播放器变量中选择团队名称,以便在其中一个数据集中创建一个团队变量,以便它可以与其他数据集匹配(或者我可以按排名进行操作吗?我不知道,真的。)但是,在我应该合并的同一数据集中创建此变量会使这变得困难。 玩家变量的一个例子可能是:" Jamal San Quentin,Kentucky St。" 我需要提取Kentucky St.部分(我用分隔符思考扫描函数),以便它可以与Kentucky St.(其他数据集中的" Name")相匹配。我正在重命名"姓名"进入"团队"并创建" Team"来自变量" Player"在另一组。但是,我似乎无法让它一起工作......
data wpa.ALLDATA work.TeamData work.NoRunners;
length team $20;
Team = scan(Player,2,',');
merge downl.runners (in=r) downl.offences (in=o rename=(name=Team)
drop=ties);
by Team;
if r and o then output work.TeamData;
else if o and not r then output work.NoRunners;
else if o or r then output wpa.ALLDATA;
run;
alldata应该有136,Teamdata应该有100,norunners应该有36.我的问题是这些集合不是在团队的基础上合并,即使在排序和团队作为变量之后
答案 0 :(得分:2)
要使用MERGE
,变量必须存在于输入数据步骤中。合并发生在任何用户语句(如SCAN()
)可以运行之前。
data team_runners ;
set runners;
length team $20;
team = left(scan(player,2,','));
player = scan(player,1,',');
run;
proc sort data=team_runners ;
by team player;
run;
现在,您可以使用新的TEAM_RUNNERS
变量将新的OFFENCES
表格与现有的TEAM
合并。
您的实际合并不是多对多合并。由于您的球队/球员表中的任何记录只会与您的球队进攻表中的最多一条记录相匹配。然后,您可以将结果分成三组:比赛,无与伦比的球员和无与伦比的球队。要包含包含所有记录的表,只需使用非条件OUTPUT语句。
data allrecords matches noteam noplayers ;
merge team_players(in=in1) offences(in=in2);
by team;
output allrecords;
if in1 and in2 then output matches;
else if in1 then output noteam ;
else output noplayers;
run;
答案 1 :(得分:1)
可能有一种更有效的方式。此解决方案使用散列对象和散列迭代器。您可以始终运行2个数据步骤,并首先将球队名称与球员名称分开,然后按照您在第二步中的操作进行操作。以下内容一下子完成。
data runners;
length Team $16.;
input Team $ Var1 Var2;
datalines;
Name1,TeamName1 1 2
Name2,TeamName2 1 3
Name1,TeamName3 2 4
Name2,TeamName4 2 4
Name2,TeamName5 2 4
;
run;
data offences;
length Name $10.;
input Name $ Var3 Var4;
datalines;
TeamName1 1 2
TeamName2 1 3
TeamName3 2 4
TeamName4 2 4
TeamName6 2 4
;
run;
data ALLDATA TeamData NoRunners (drop=rc);
if 0 then set runners;
if _N_ =1 then
do;
declare hash hh(ordered:'A');
declare hiter hi('hh');
hh.definekey('Team');
hh.definedata('Team','Var1','Var2','Name');
hh.definedone();
end;
do while(not theend);
set runners (rename=(Team=TeamName)) end=theend;
Team = prxchange("s/^(.+),//",-1,TeamName);
Name = prxchange("s/,(.+)$//",-1,TeamName);
hh.ref();
drop TeamName;
end;
do while(not last);
set offences (rename=(Name=Team)) end=last;
rc= hh.find();
if rc =0 then do;
output TeamData ALLDATA;
hh.remove();
end;
else do;
call missing(Var1,Var2,Name);
output NoRunners ALLDATA;
end;
end;
rc = hi.first();
do while(rc=0);
output ALLDATA;
rc = hi.next();
end;
stop;
run;