基于 sas 标准的子集

Subset based on criteria in sas

希望我的问题措辞正确。

我提取了一系列板球记分卡,现在有 'x' 个记分卡(数据集),每个包含 'n' 行观察结果。我想要做的是通过自动将每个记分卡数据集除以 8,从 'x' 记分卡创建 'k' 子集。(例如,我的一个记分卡有 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 个子集中的每一个转置以产生以下 (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

两个数据集将堆叠在每个数据集之上:

NT Broom b henry 21 12 15 3 1 140.00

JD Ryder b Henry 1 3 2 0 0 50.00

希望这是有道理的。

提前致谢, 安吉特

到目前为止我做了什么:

/击球子集宏/

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);

以上代码适用于单个记分卡 (match=665647),但不适用于一系列记分卡数据。我将宏更改为 %macro create_subsets(count,compile_bat_cleaned_&match) 但它似乎不起作用

你遗漏的是分组处理。 SAS 中的大多数东西你不必将每个 ID 或类似的东西分成一个数据集;您分配一个 ID 变量,然后 by 该变量执行任何操作。

在这种情况下,如果您有一个变量 playerID,前 8 行为 1,后 8 行 (9-16) 为 2,等等,那么您可以处理转置 by playerID;,只做一个转置,从一个数据集到另一个数据集。没有宏,没有大惊小怪。