将数据集拆分为 N 个部分
split a dataset into N pieces
N 由特定字段中不同值的数量决定。在实际情况下,N 很大,因为每个字段(char 列)都有许多不同的值。
示例数据:
A B C D V1 V2 V3 V4
ab ba cf dm
ab bc cf dm
ab bc cg dm
ac bd cg dm
Vi's
为数值列(可能存在缺失值)。 A B C D 是字符,其值表示不同的子组(无缺失数据)。
字符列数未知。每个字符列中不同值的数量也是未知的。
如果 col(i) 有 n(i) 个不同的值,则 N = n(1) * n(2) * ...
。在示例数据中,N = 2 * 3 * 2 * 1
.
目标:
为不同字段的每个唯一组合生成一个数据集。
相关链接:
Split SAS dataset Whosebug
正如其他人所说,哈希表 确实会 更好(并且可能更易于管理)。不过,这个怎么样?
测试数据:
data dummy ;
input A $ B $ C $ D $ v1 v2 v3 v4 ;
cards ;
ab ba cf dm 1 2 3 4
ab bc cf dm 5 6 7 8
ab bc cf dm 1 2 3 4
ab bc cg dm 9 0 1 2
ac bd cg dm 3 4 5 6
;run ;
按字符变量对数据进行排序(不过只需要在此处列出):
proc sort data=dummy ;
by a b c d ;
data output ;
set dummy end=EndoFile ;
by a b c d ;
if first.d then count+1 ;
if EndoFile then call symput('ucount',count) ;
run ;
从原始数据创建单独的数据集;
%macro split ;
%do i=1 %to &ucount ;
data d&i ;
set output(where=(count=&i)) ;
run ;
%end ;
%mend split ;
%split ;
使用与 Bendy 创建的相同的虚拟数据集,这将根据 a、b、c 和 d 的唯一组合拆分为一个数据集:
data dummy ;
input A $ B $ C $ D $ v1 v2 v3 v4 ;
cards ;
ab ba cf dm 1 2 3 4
ab bc cf dm 5 6 7 8
ab bc cf dm 1 2 3 4
ab bc cg dm 9 0 1 2
ac bd cg dm 3 4 5 6
;run ;
%macro lup;
proc sql noprint;
select distinct compress(a!!"_"!!b!!"_"!!c!!"_"!!d) into :dataset1-:dataset99999
from dummy;
quit;
%put &sqlobs;
data
%do i=1 %to &sqlobs;
&&dataset&i
%end;
;
set dummy;
%do i=1 %to &sqlobs;
if compress(a!!"_"!!b!!"_"!!c!!"_"!!d)="&&dataset&i" then output &&dataset&i;
%end;
run;
%mend;
%lup;
N 由特定字段中不同值的数量决定。在实际情况下,N 很大,因为每个字段(char 列)都有许多不同的值。
示例数据:
A B C D V1 V2 V3 V4
ab ba cf dm
ab bc cf dm
ab bc cg dm
ac bd cg dm
Vi's
为数值列(可能存在缺失值)。 A B C D 是字符,其值表示不同的子组(无缺失数据)。
字符列数未知。每个字符列中不同值的数量也是未知的。
如果 col(i) 有 n(i) 个不同的值,则 N = n(1) * n(2) * ...
。在示例数据中,N = 2 * 3 * 2 * 1
.
目标:
为不同字段的每个唯一组合生成一个数据集。
相关链接:
Split SAS dataset Whosebug
正如其他人所说,哈希表 确实会 更好(并且可能更易于管理)。不过,这个怎么样?
测试数据:
data dummy ;
input A $ B $ C $ D $ v1 v2 v3 v4 ;
cards ;
ab ba cf dm 1 2 3 4
ab bc cf dm 5 6 7 8
ab bc cf dm 1 2 3 4
ab bc cg dm 9 0 1 2
ac bd cg dm 3 4 5 6
;run ;
按字符变量对数据进行排序(不过只需要在此处列出):
proc sort data=dummy ;
by a b c d ;
data output ;
set dummy end=EndoFile ;
by a b c d ;
if first.d then count+1 ;
if EndoFile then call symput('ucount',count) ;
run ;
从原始数据创建单独的数据集;
%macro split ;
%do i=1 %to &ucount ;
data d&i ;
set output(where=(count=&i)) ;
run ;
%end ;
%mend split ;
%split ;
使用与 Bendy 创建的相同的虚拟数据集,这将根据 a、b、c 和 d 的唯一组合拆分为一个数据集:
data dummy ;
input A $ B $ C $ D $ v1 v2 v3 v4 ;
cards ;
ab ba cf dm 1 2 3 4
ab bc cf dm 5 6 7 8
ab bc cf dm 1 2 3 4
ab bc cg dm 9 0 1 2
ac bd cg dm 3 4 5 6
;run ;
%macro lup;
proc sql noprint;
select distinct compress(a!!"_"!!b!!"_"!!c!!"_"!!d) into :dataset1-:dataset99999
from dummy;
quit;
%put &sqlobs;
data
%do i=1 %to &sqlobs;
&&dataset&i
%end;
;
set dummy;
%do i=1 %to &sqlobs;
if compress(a!!"_"!!b!!"_"!!c!!"_"!!d)="&&dataset&i" then output &&dataset&i;
%end;
run;
%mend;
%lup;