我有一个 SAS 数据集,如下所示:
id | dept | ...
1 A
2 A
3 A
4 A
5 A
6 A
7 A
8 A
9 B
10 B
11 B
12 B
13 B
每个观察代表一个人。
我想将数据集分成“团队”数据集,每个数据集最多可以有 3 个观察值。
对于上面的示例,这意味着为 A 部门创建 3 个数据集(其中 2 个数据集将包含 3 个观测值,第三个数据集将包含 2 个观测值)。 B 部门有 2 个数据集(1 个包含 3 个观测值,另一个包含 2 个观测值)。
就像这样:
第一个数据集(deptA1):
id | dept | ...
1 A
2 A
3 A
第二个数据集 (deptA2)
id | dept | ...
4 A
5 A
6 A
第三个数据集(deptA3)
id | dept | ...
7 A
8 A
第四个数据集(deptB1)
id | dept | ...
9 B
10 B
11 B
第五数据集(deptB2)
id | dept | ...
12 B
13 B
我使用的完整数据集包含超过 50 个部门的数千个观察结果。我可以计算出每个部门需要多少数据集,并且我认为宏是最好的方法,因为所需的数据集数量是动态的。但我无法弄清楚创建数据集的逻辑,以便它们最多有 3 个观察值。任何帮助表示赞赏。
另一个版本。
与 DavB 版本相比,它仅处理一次输入数据,并在单个数据步骤中将其拆分为多个表。
此外,如果需要更复杂的拆分规则,可以在数据步骤视图 WORK.SOURCE_PREP 中实现。
data WORK.SOURCE;
infile cards;
length ID 8 dept $1;
input ID dept;
cards;
1 A
2 A
3 A
4 A
5 A
6 A
7 A
8 A
9 B
10 B
11 B
12 B
13 B
14 C
15 C
16 C
17 C
18 C
19 C
20 C
;
run;
proc sort data=WORK.SOURCE;
by dept ID;
run;
data WORK.SOURCE_PREP / view=WORK.SOURCE_PREP;
set WORK.SOURCE;
by dept;
length table_name $32;
if first.dept then do;
count = 1;
table = 1;
end;
else count + 1;
if count > 3 then do;
count = 1;
table + 1;
end;
/* variable TABLE_NAME to hold table name */
TABLE_NAME = catt('WORK.', dept, put(table, 3. -L));
run;
/* prepare list of tables */
proc sql noprint;
create table table_list as
select distinct TABLE_NAME from WORK.SOURCE_PREP where not missing(table_name)
;
%let table_cnt=&sqlobs;
select table_name into :table_list separated by ' ' from table_list;
select table_name into :tab1 - :tab&table_cnt from table_list;
quit;
%put &table_list;
%macro loop_when(cnt, var);
%do i=1 %to &cnt;
when ("&&&var.&i") output &&&var.&i;
%end;
%mend;
data &table_list;
set WORK.SOURCE_PREP;
select (TABLE_NAME);
/* generate OUTPUT statements */
%loop_when(&table_cnt, tab)
end;
run;
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)