SAS从变量类别输出数据集

SAS从变量类别输出数据集,sas,Sas,我有一个包含多个变量的大型数据集 使用其中的两个变量et1和bl1,我想用每个变量的类别创建输出数据集 Et1有七个级别,编码为数字(尽管我有一个应用于数字类别的格式) Bl1有四个级别,它们也被编码为数字(同样也有一种格式) 我想创建28个输出数据集(et1*7和bl1*4=28),理想情况下使用格式名称作为数据集名称 干杯, John为什么要创建这么多数据集?对我来说,这似乎是一个非常糟糕的主意。将数据保存在一个数据集中,并根据需要使用它。你想在这里做什么?我同意Joe的观点,你可能处理错了

我有一个包含多个变量的大型数据集

使用其中的两个变量et1和bl1,我想用每个变量的类别创建输出数据集

Et1有七个级别,编码为数字(尽管我有一个应用于数字类别的格式)

Bl1有四个级别,它们也被编码为数字(同样也有一种格式)

我想创建28个输出数据集(et1*7和bl1*4=28),理想情况下使用格式名称作为数据集名称

干杯,
John

为什么要创建这么多数据集?对我来说,这似乎是一个非常糟糕的主意。将数据保存在一个数据集中,并根据需要使用它。你想在这里做什么?我同意Joe的观点,你可能处理错了问题。如果你坚持创建28个数据集,那么我建议在28 If/then/ELSE st中进行硬编码a根据ET1和BL1变量的值将数据输出到数据集的步骤。有更有效和动态的方法可以通过宏处理和/或数组实现这一点,但在我建议编码之前,您需要提供一个更好的示例来说明您正在尝试的操作。伙计们-是的,我明白您关于将数据保持在一起的观点,分解数据是该项目的一项要求。我曾考虑过编写if/then语句,但我认为这将是非常困难和不必要的。我更愿意编写一个宏来完成这项工作。我曾尝试过包含两个do循环,但未能实现这一点。很好,我考虑的是相同的通用方法方法。也可以在不显式形成宏的情况下执行此操作。也可以在proc sql中形成if语句。不过,您可能希望在proc sql中添加noprint,这更像是一个样式问题。
proc format;
value classa
   1='ADATA'
   2='BDATA'
;
value classb
  1='CDATA'
  2='DDATA'
;
run;

data in;
length class_a class_b $ 8;
do i=1 to 2;
   do j=1 to 2;
      class_a=trim(left(put(i,classa.)));
      class_b=trim(left(put(j,classb.)));
      someVar=ranuni(0);
      someOtherVar=ranuni(0);
      output;
   end;
end;
run;



options mprint symbolgen mlogic;

%macro separate(dsn=, classvar1=, classvar2=);

proc sql;
select distinct trim(left(&classvar1)) || '_' || trim(left(&classvar2))
into :dsnames separated by ' '
from &dsn;
quit;

data &dsnames.;
set &dsn;
%let idx=1;
%let thiscombo=%sysfunc(scan(&dsnames,&idx,%str( )));
%do %while(%length(&thiscombo) > 0);
IF ( &classvar1 = %sysfunc(quote(%sysfunc(scan(&thiscombo,1,%str(_))))) AND
     &classvar2 = %sysfunc(quote(%sysfunc(scan(&thiscombo,2,%str(_))))) )
    THEN OUTPUT &thiscombo;
    %let idx=%eval(&idx+1);
    %let thiscombo=%sysfunc(scan(&dsnames,&idx,%str( )));
%end;
run;

%mend;

%separate(dsn=in, classvar1=class_a, classvar2=class_b);