将数据集拆分为 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

http://www.sascommunity.org/wiki/Split_Data_into_Subsets

正如其他人所说,哈希表 确实会 更好(并且可能更易于管理)。不过,这个怎么样?

测试数据:

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;