我希望我能正确地说出这个问题。
我已经推出了一系列板球记分卡,现在已经有了' 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)数据集中的每个子集:
NT Broom b henry 21 12 15 3 1 140.00
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);
上面的代码适用于个人记分卡(匹配= 665647),但不适用于一系列记分卡数据。我将宏更改为%macro create_subsets(count,compile_bat_cleaned_&match)
但它似乎无法运作
答案 0 :(得分:2)
您缺少的是按群组处理。在SAS的大多数事情中,您不必将每个ID分成一个数据集或类似的东西;你分配一个ID变量,然后做 by 那个变量。
在这种情况下,如果你有一个变量playerID
,前8行有1,那么后8行(9-16)等为2,那么你可以proc transpose { {1}},并且只进行一次转置,从一个数据集到另一个数据集。没有宏观,没有大惊小怪。