为解决上述错误而苦苦挣扎:
变量已被定义为字符和数字
我有一个提取物,在SAS中打印一个表,另一个提取物提取,每天有数百个微表,其中有一个或两个在列中有数值。
我目前的步骤如下:
DATA ALL;
SET Library.XYZ:;
RUN;
冒号查找标记为XYZdate9.
;
但是当我运行代码时,我在A列上得到了错误。 有没有办法在合并表时将列强制为字符还是完全删除它?
答案 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;