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

时间:2015-09-03 11:07:10

标签: sas

为解决上述错误而苦苦挣扎:

  

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

我有一个提取物,在SAS中打印一个表,另一个提取物提取,每天有数百个微表,其中有一个或两个在列中有数值。

我目前的步骤如下:

DATA ALL;
   SET Library.XYZ:;
RUN;

冒号查找标记为XYZdate9.;

的任何内容

但是当我运行代码时,我在A列上得到了错误。 有没有办法在合并表时将列强制为字符还是完全删除它?

2 个答案:

答案 0 :(得分:0)

手动溶解

假设XUZbbb的problemColumn有问题,可以编写

DATA ALL;
SET Library.XYZaaa 
    Library.XYZbbb (rename (problemColumn = problemChar))
    Library.XYZccc ;

现在对于来自XYZbbb的观察(行),problemColumn将没有值(缺失值为.)但是problemChar将具有您需要的值的字符表示。

if problemColumn eq . then problemColumn = input(problemChar, best12.);
RUN;

您可能需要将输入格式best12.替换为适合您数据的内容。

自动溶出

编写一个proc SQL,列出您的数据集,并为需要它的人重命名:

PROC SQL;
    select 'Library.'|| memName ||
           case when type = 'char' then ' (rename (problemColumn = problemChar))' 
                else '' end
    into :setsToRead separated by ' '
    from sasHelp.vcolumns
    where libName eq 'LIBRARY' and memName like 'XYZ%' and name = 'problemColumn';
quit;

现在使用创建的宏变量

Data ALL;
    Set &setsToRead.;

等等

答案 1 :(得分:0)

理想情况下,您应该修复源,以便所有列都与主模式定义的类型相同。选择只丢弃字段,这看起来很危险,你可以使用带有FORCE选项的PROC APPEND。'

以下是一些代码,可以找到问题列,以便您手动修复它们。

*Code to isolate the variable/tables that may be the issue;
proc sql;
create table variable_types as
select libname, memname, upper(name) as name, type
from sashelp.vcolumn
where libname='WORK' and upper(memname) like 'CLASS%'
order by name, type;

create table variable_mismatch as
select * 
from variable_types
where name in (select name from variable_types group by name having min(type) ne max(type));
quit;

如果您只是想删除需要放入宏循环的变量,那么这里有一些代码。

*Create sample datasets;
data class;
set sashelp.class;
run;

data class2;
set sashelp.class(rename=age=age_num);

age=put(age_num, 2.);
run;

*Append via data step - generates error;
data want;
set class class2;
run;

*Append via proc append;
proc append base=class data=class2 force;
run;