子集基于sas中的标准

时间:2015-04-09 20:36:36

标签: macros sas subset

我希望我能正确地说出这个问题。

我已经推出了一系列板球记分卡,现在已经有了' x'记分卡(数据集),每个记分卡包含' n'观察行。我想做的是创造''来自' x'的子集记分卡通过自动将每个记分卡数据集除以8.(例如,我的记分卡之一具有168个观察结果,因此该记分卡将被分成21个子集,而另一个记分卡包含128个条目,因此它将被分成16个子集)。

然后我想转置每个' k'子集,这将给我一个包含一行的数据集。最后我想要堆叠' k'转置数据集以创建一个大数据集。

小例子:

NT Broom
b Henry
21
12
15
3
1
140
JD ryder
b Henry
1
3
2
0
0
50.00

(其中一个记分卡的小提取)上面的数据集将分为2个子集,然后通过转置生成以下(2)数据集中的每个子集:

  1. NT Broom b henry 21 12 15 3 1 140.00
  2. JD Ryder b Henry 1 3 2 0 0 50.00
  3. 两个数据集将堆叠在每个数据集之上:

    NT Broom b henry 21 12 15 3 1 140.00

    JD Ryder b Henry 1 3 2 0 0 50.00

    希望这是有道理的。

    提前致谢, Ankit

    我做得很远:

    / 击败子集宏 /

    proc sql;
         select count (8) into:total from compile_bat_cleaned_&match;
     quit;
    
    
    %macro create_subsets(count,compile_bat_cleaned_665647);
        %let cnt = %sysfunc(ceil(%sysevalf(&count/8)));
        %let num = 1;
    
        %do i = 1 %to &cnt;
            %if(&i = &cnt) %then %do;
                %let toread = &count;
            %end;
            %else %do;
                %let toread = &num + 7;
             %end;
    
       data compile_bat_cleaned_665647_&i;
         set compile_bat_cleaned_665647 (firstobs=&num obs=%eval(&toread)); 
       run;
    
      proc transpose data = compile_bat_cleaned_665647_&i out = compile_bat_cleaned_665647_&i (drop=_name_);         
       var bat_det_2_term details_4;
    
       data compile_bat_cleaned_665647_&i;
          set compile_bat_cleaned_665647_&i (firstobs = 2);
       rename COL1 = Batsman
              COL2 = Dismissal
              COL3 = Runs_Scored
              COL4 = Minutes
              COL5 = Balls
              COL6 = Fours
              COL7 = Sixes
              COL8 = Strike_Rate;
    
       %let num = %eval(&num + 8);
      %end;
    
    data batters_merged_665647;
      set 
      %do i = 1 %to &cnt;
        compile_bat_cleaned_665647_&i
      %end;
      ;
    run;
    
    %mend create_subsets;
    
    %create_subsets(&total,compile_bat_cleaned_665647);
    

    上面的代码适用于个人记分卡(匹配= 665647),但不适用于一系列记分卡数据。我将宏更改为%macro create_subsets(count,compile_bat_cleaned_&match) 但它似乎无法运作

1 个答案:

答案 0 :(得分:2)

您缺少的是按群组处理。在SAS的大多数事情中,您不必将每个ID分成一个数据集或类似的东西;你分配一个ID变量,然后做 by 那个变量。

在这种情况下,如果你有一个变量playerID,前8行有1,那么后8行(9-16)等为2,那么你可以proc transpose { {1}},并且只进行一次转置,从一个数据集到另一个数据集。没有宏观,没有大惊小怪。