【问题标题】:Subset based on criteria in sas基于 sas 中的标准的子集
【发布时间】:2015-04-09 20:36:36
【问题描述】:

希望我的问题措辞正确。

我提取了一系列板球记分卡,现在有“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

希望这是有道理的。

提前致谢, 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);

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

【问题讨论】:

  • 你有没有尝试过?我们不会为你做这个项目!向我们展示您尝试过的代码,特别是哪些代码不起作用。
  • 哦,是的,绝对 - 我已经编辑了我上面的问题并包含了我的一些代码
  • 听乔的,这里不需要宏。

标签: macros sas subset


【解决方案1】:

您缺少的是按组处理。在 SAS 中,您不必将每个 ID 拆分为一个数据集或类似的东西;您分配一个 ID 变量,然后执行 by 该变量的任何操作。

在这种情况下,如果您有一个变量playerID,其前 8 行为 1,后 8 行 (9-16) 为 2,依此类推,那么您可以 proc transpose by playerID; ,并且只进行一次转置,全部从一个数据集到另一个数据集。没有宏,没有大惊小怪。

【讨论】:

  • 谢谢乔,我已经使用宏来处理它了。谢谢,Ankit
猜你喜欢
  • 2013-11-02
  • 2021-08-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-03-30
  • 1970-01-01
  • 2015-10-19
相关资源
最近更新 更多