Sas 多对多合并在一个大数据步骤中

Sas 多对多合并在一个大数据步骤中,sas,Sas,我正在从多对多合并创建三个数据集。我知道我需要从player变量中选择团队名称,以便在其中一个数据集中创建团队变量,以便它可以与另一个数据集匹配,或者我可以按排名进行匹配吗?我不知道,真的。。然而,在我应该合并的同一个数据集中创建这个变量使这变得很困难。 player变量的一个示例可能是:肯塔基州圣昆廷的Jamal San Quentin。 我需要提取肯塔基圣帕特,我想用一个定界符扫描函数,这样它就可以和肯塔基圣帕特匹配,肯塔基圣帕特是另一个数据集中的名字。我将名字重命名为Team,并从另一个集

我正在从多对多合并创建三个数据集。我知道我需要从player变量中选择团队名称,以便在其中一个数据集中创建团队变量,以便它可以与另一个数据集匹配,或者我可以按排名进行匹配吗?我不知道,真的。。然而,在我应该合并的同一个数据集中创建这个变量使这变得很困难。 player变量的一个示例可能是:肯塔基州圣昆廷的Jamal San Quentin。 我需要提取肯塔基圣帕特,我想用一个定界符扫描函数,这样它就可以和肯塔基圣帕特匹配,肯塔基圣帕特是另一个数据集中的名字。我将名字重命名为Team,并从另一个集合中的变量Player创建Team。然而,我似乎无法使所有的工作一起进行

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个,NoRunner应该有36个。我的问题是,这些集合没有基于团队进行合并,即使是在将团队作为一个by变量进行排序和执行之后。

可能有一种更有效的方法。此解决方案使用哈希对象和哈希迭代器。您始终可以运行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;
要使用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;
现在,您可以通过新的团队变量将新的团队跑步者表与现有的违规行为合并

您的实际合并不是多对多合并。因为你的球队/球员表中的任何记录最多只能与你的球队进攻表中的一项记录相匹配。然后,您可以将结果分为三组:比赛、非比赛球员和非比赛球队。要包含包含所有记录的表,只需使用非条件输出语句

 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;

请提供一些来自输入数据集和预期输出数据集的样本行。有一些来自基集的观察结果。请以文本形式发布。我不理解这些,以前从未见过哈希对象或哈希迭代器。理想情况下,可以使用排序和重命名,但要保持简单,只需一两个数据步骤。你显然对这门语言了解很多,但对我来说有点快。那么Tom提供的解决方案可能是最适合你的。合并前,变量组必须存在于文件中。SAS逐观察处理观察,它在数据集中的每一行上循环。您需要定义数据步骤集的输入,合并,。。。然后才能使用输入文件中的变量。我以为你想在一个数据步骤中完成。毕竟这篇文章的标题暗示了…:DTom,再次感谢您的帮助。大部分都在工作。但是,在选择数据集的输出时,我需要一个包含136个观测值的数据集—一个不是直接匹配的数据集,但其中包含两个数据集的观测值。这一个给了我noteam数据集和0个观测值。我们如何改变这一点?数据匹配所有数据无运行器;合并团队\u runnersin=in1 offencesin=in2;团队合作;如果输入1和输入2,则输出匹配;否则,如果是in2而不是in1,则输出norunner;如果输入1或输入2,则输出所有数据;跑我不确定我是否理解,但是如果你想让第三组不同于in1而不是in2,那么你需要删除ELSE。事实上,由于您对所有三个组的说明都已完成,因此请删除这两个关键字。如果in1或in2是每条记录,那么就不需要IF语句,只需使用一个简单的输出。^听起来像是一个计划。谢谢你的帮助,汤姆。