【问题标题】:Variable has been defined as both character and numeric变量已被定义为字符和数字
【发布时间】:2015-09-03 11:07:10
【问题描述】:

正在努力解决上述错误:

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

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

我当前的步骤如下所示:

DATA ALL;
   SET Library.XYZ:;
RUN;

冒号查找标记为XYZdate9.的任何内容;

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

【问题讨论】:

  • 我猜你不知道哪些表不同?然后,您可以在 datastep 中使用简单的 put 语句一一更改它们。
  • 我不知道,有数百个表,我猜我可以进行 proc 比较,但不确定如何在这么多表中进行转换。
  • 您是如何创建这些数据集的?您是否使用了 PROC IMPORT?如果您使用 PROC IMPORT,您可能会遇到此类问题,因为它会尝试根据它看到的值来猜测您拥有哪些类型的变量。因此,不同的数据子集可能会产生不同的选择。如果您可以将 PROC IMPORT 替换为一致地创建数据集的实际数据步骤,那么在合并步骤中您将不会遇到此问题。

标签: sas


【解决方案1】:

手动解决

假设你对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.;

等等

【讨论】:

  • 感谢您的回复。问题是我无法确定哪个表包含问题列,因为有超过 100 个表名称 XYZdate。这意味着要花费数天时间来查找导致变量错误的一两个。
  • 这就是自动化解决方案的用武之地。我只是希望你不要反弹到宏变量的最大长度。如果是这样,我确实有其他选择。
  • 顺便说一下,我没有测试这个。
  • 我试试看。您能否详细说明我为“问题字符”输入的内容?感谢您抽出宝贵时间提供帮助
  • memName like 'XYZ%' 是一个 sql 条件,说明 memName 应该是 XYZ,然后是其他任何内容。 problemChar 只是一个由 rename 语句创建的临时变量。
【解决方案2】:

理想情况下,您应该修复源,以便所有列的类型与主架构定义的类型相同。选择只删除字段,这似乎很危险,您可以将 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;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-01-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-09
    • 1970-01-01
    相关资源
    最近更新 更多