我有一个包含 50 列的表,其中 25 列被转换为字符,因为数值中有 NA 值,其余实际上是字符列。 首先,我尝试将 NA 更改为“.”。然后我请求从 CHAR 到 NUM 的转换。我使用 SAS 宏来帮助我,所以我不需要将每个列名都输入到语句中。 即使尝试了 3 种不同的方法来转换它,每次我检查表或使用 proc 内容来查看结果时,列仍以 CHAR 形式继续。 LOG 显示“已完成编译且没有错误”。 下面我简化了代码:
没有宏的第一次尝试:
DATA Report1_NEW;
SET Report1;
if 'NA' THEN '.';
END;
RUN;
DATA Report1_NEW;
SET Report1;
NUM_change = INPUT((col1, col2, col3, ..., col25),?comma9.);
RUN;
第二次尝试宏:
%let Num_col = col1, col2, col3, ..., col25;
%macro Report1;
DATA Report1_NEW;
SET Report1;
array &Num_col;
do over &Num_col;
if &Num_col='NA' then &Num_col='.';
end;
run;
DATA Report1_NEW;
SET Report1;
Value_&Num_col = INPUT(&Num_col,?comma9.);
RUN;
%mend Report1;
第三次尝试宏:
%let Num_col = col1, col2, col3, ..., col25;
%macro Report1;
DATA Report1_NEW;
SET Report1;
array &Num_col;
run;
PROC FORMAT;
INVALUE (&Num_col);
'NA'='.';
RUN;
DATA Report1_NEW;
SET Report1;
Value_&Num_col = INPUT(&Num_col,?comma9.);
RUN;
%mend Report1;
我希望一旦列被转换为 NUMERIC,之后我就可以用其中的一些进行计算。
我是 SAS 的新手,非常感谢您的帮助。 谢谢!
所以你的前两次尝试没有使用有效的 SAS 代码。
在第一个
if 'NA' THEN '.';
END;
IF中的条件其实不是布尔表达式。 THEN 之后没有语句,只有一个值。你有一个没有结束任何事情的结束。
在第二个中,您错误地使用了 INPUT() 函数。
NUM_change = INPUT((col1, col2, col3, ..., col25),?comma9.);
您只能给 INPUT() 函数两个参数。要读取的字符串和用于读取它的信息。
你的第三次尝试也好不到哪里去,你已经添加了尝试使用宏语言生成代码的复杂性。
但是没有必要求助于CODE GENERATION对一系列变量执行相同的操作。这就是 ARRAY 概念的目的。
data Report1_NEW;
set Report1;
array chars col1-col25 ;
array nums newcol1-newcol25 ;
do index=1 to dim(chars);
nums[index] = input(chars[index],??comma32.);
end;
drop index ;
run;
如果您的实际变量名称未使用数字后缀命名,如 COL1、COL2 等,则只需在两个数组语句中列出以空格分隔的名称。确保两个列表中的名称数量相同。确保 NUMS 数组中的名称尚未被输入数据集中的其他变量使用。