Sas 变量已定义为字符和数字
正在努力解决上述错误: 变量已定义为字符和数字 我有一个摘录,它在SAS中打印一个表格,另一个摘录提取,每天有数百个微表格,其中有一个或两个在一列中有数值 我当前的步骤如下所示:Sas 变量已定义为字符和数字,sas,Sas,正在努力解决上述错误: 变量已定义为字符和数字 我有一个摘录,它在SAS中打印一个表格,另一个摘录提取,每天有数百个微表格,其中有一个或两个在一列中有数值 我当前的步骤如下所示: DATA ALL; SET Library.XYZ:; RUN; 冒号查找标记为XYZdate9的任何内容 但是当我运行代码时,我在列A上得到了错误。 有没有办法在合并表时强制将列转换为字符或完全删除它?手动解决方案 假设您对XUZBB的problemColumn有问题,您可以编写 DATA ALL; SET
DATA ALL;
SET Library.XYZ:;
RUN;
冒号查找标记为XYZdate9的任何内容
但是当我运行代码时,我在列A上得到了错误。
有没有办法在合并表时强制将列转换为字符或完全删除它?手动解决方案
假设您对XUZBB的problemColumn有问题,您可以编写
DATA ALL;
SET Library.XYZaaa
Library.XYZbbb (rename (problemColumn = problemChar))
Library.XYZccc ;
现在对于XYZBB中的观测行,problemColumn将不会有值missing value is。但是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.;
以此类推理想情况下,您应该修复源代码,以便所有列都是主模式定义的相同类型。使用删除字段的选项,这似乎很危险,您可以将PROC APPEND与FORCE选项一起使用 下面是一些查找问题列的代码,以便您可以手动修复它们
*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;
我想你不知道哪几张桌子不同吧?然后你可以在一个数据步骤中用一个简单的put语句一个接一个地修改它们。我不知道,有几百个表,我猜我可以做一个过程比较,但不确定我如何在那么多表之间转换。你是如何创建这些数据集的?您是否使用PROC导入?如果使用PROC IMPORT,您可能会遇到这种类型的问题,因为它试图根据看到的值猜测您拥有哪些类型的变量。所以不同的数据子集可以产生不同的选择。如果您可以使用实际的数据步骤来替换PROC导入,从而一致地创建数据集,那么在合并步骤中就不会出现此问题。感谢您的回复。问题是我无法确定哪个表包含问题列,因为有超过100个表名XYZdate。这意味着要花上几天的时间去寻找导致变量错误的一两个原因,这就是自动化解决方案的目的。我只是希望您不要跳转到宏变量的最大长度。如果是这样的话,我确实有一个选择。顺便说一句,我没有测试这个。我会尝试一下。你能详细说明我为“problemchar”输入的内容吗?感谢您花时间帮助memName,例如“XYZ%”是一个sql条件,声明memName应该是XYZ,后跟其他任何内容。problemChar只是由rename语句创建的临时变量。