【问题标题】:SAS out-putting datasets from variable categoriesSAS 从变量类别中输出数据集
【发布时间】:2013-01-17 04:31:58
【问题描述】:

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

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

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

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

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

干杯, 约翰

【问题讨论】:

  • 为什么要创建这么多数据集?对我来说,这似乎是一个非常糟糕的主意。将您的数据保存在一个数据集中,并根据需要使用它。你想在这里做什么?
  • 我同意乔的观点,你可能错误地处理了这个问题。如果您坚持创建 28 个数据集,那么我建议在 28 个 IF/THEN/ELSE 语句中进行硬编码,以根据您的 ET1 和 BL1 变量的值输出到数据集。使用宏处理和/或数组有更有效和更动态的方法,但在我建议对其进行编码之前,您需要提供一个更好的示例来说明您正在尝试的内容。
  • 伙计们 - 是的,我明白你关于将数据保存在一起的观点,但是,分解数据是项目的要求。
  • 我曾考虑过编写 if/then 语句,但我认为这将非常艰巨且不必要。我宁愿写一个宏来做到这一点。我已经尝试过包含两个 do 循环,但是无法使其正常工作。

标签: sas


【解决方案1】:
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);

【讨论】:

  • 很好,我在考虑同样的通用方法。也可以在不显式形成宏的情况下执行此操作。通过在 proc sql 中形成 if 语句。不过,您可能想在 proc sql 中添加一个 noprint,但这更像是一个样式问题。
猜你喜欢
  • 1970-01-01
  • 2023-03-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-08-23
  • 2017-11-11
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多