SAS变量已被定义为字符和数字

时间:2016-10-26 15:01:19

标签: loops error-handling macros sas

我在库中有100个数据集(称为DATA)。当我想将它们合并到一个数据集中时,SAS表示一些变量定义为字符和数字。所以我使用以下代码通过更改变量的格式来修改问题。但是,SAS仍然报告错误:当我尝试更改其格式时,变量已被定义为字符和数字。

编辑:我更改了代码并使用input函数来解决此问题。但是,它报告了如图所示的相同错误:enter image description here

%macro step1(sourcelib=,source=); 
proc sql noprint;  /*read datasets in a library*/
  create table mytables as
  select *
  from dictionary.tables
  where libname = &sourcelib
  order by memname ;

  select count(memname) 
  into:obs 
  from mytables;

  %let obs=&obs.;

  select memname
  into : memname1-:memname&obs.
  from mytables;
quit;

  data 
  %do i=1 %to &obs.;
  &source.&&memname&i
  %end;
  ;
  set
  %do i=1 %to &obs.;
  &source.&&memname&i
  %end;
  ;
 price1=input(price,best12.);
 volume1=input(volume,best12.);
 bid_imp__vol1=input(bid_imp__vol,best12.);
 Ask_Imp__Vol1=input(Ask_Imp__Vol,best12.);
 drop price volume bid_imp__vol ask_Imp__Vol;
  run;

data 
  %do i=1 %to &obs.;
  &source.&&memname&i
  %end;
  ;
  set
  %do i=1 %to &obs.;
  &source.&&memname&i
  %end; 
  (rename=(price1=price volume1=volume bid_imp__vol1=bid_imp__vol Ask_Imp__Vol1=Ask_Imp__Vol));
  run;
%mend;


 %step1(sourcelib='DATA',source=DATA.);

1 个答案:

答案 0 :(得分:1)

dictionary.columns与此问题没有任何关系。类型是问题。格式是“你希望我如何以人类可读的格式打印出来”,但Type是“这块内存中的基本内容”。

你需要在这里做三件事之一。

  1. 删除有冲突的变量。
  2. 在上一步或SET数据集选项中重命名冲突的变量。
  3. 在上一步中更改冲突变量的类型,或者在SET数据集选项中重命名,然后转换为正确的类型。
  4. 在如上所述的宏中,您可以做的一件事是使用dictionary.columns来确定哪些变量是错误的类型。由于你看起来有一组有限的变量(即,这不需要完全通用),你可以选择一种类型(听起来像数字)和查询import matplotlib.pyplot as plt test_list = ['a', 'b', 'b', 'c'] plt.hist(test_list) plt.show() 任何不属于的变量那种类型。然后将转换应用于符合条件(角色)的转换。

    你构建宏的方式会使这个更复杂一点;我想你可能想要一个单独的宏来遍历每个数据集,并在你运行这个宏之前将它的类型一次转换为一致的类型。否则,管理宏变量列表会很头疼。