我有一组A1-A54列。所有这些列都应设置为数字格式。但是,这些列中的某些条目存储为“ \ N”,这会破坏列格式,并且不允许在列上运行诸如proc means之类的操作。想了解如何通过在所有列上运行循环来将这些值设置为丢失。
我尝试在所有列上使用数组 numeric 运行do循环,但是由于某些列中存在\ N,它们正被格式化为字符串变量,并且数组方法无法正常工作。
array nums[*] _numeric_;
if nums[i]='\N' then nums[i]=.;
end;
这不是将\ N转换为缺少的值,因为SAS将其解释为数字变量中的字符串并引发错误。
在“数值”列中找到错误字符串变量。在运行循环时。
答案 0 :(得分:2)
发现非数字数据的导入过程将导致该列为_character_
,因此您的A1-A54
中的某些字符是字符。
如果您对此进行编码会怎样?
array mydata A1-A54;
看到了
ERROR: All variables in array list must be the same type, i.e., all numeric or character.
您需要标识A
个字符列,并将它们的值转换为命名的数字(如果可能),如果无法转换,则将丢失数字值(如预期)。
示例:
data have;
length a1 8 a2-a4 $15; %* pretend the import created a mixed bag of types;
row = 1;
a1 = 123;
a2 = '123' || byte(10) || '456';
a3 = byte(10);
a4 = '123';
output;
row = 2;
a1 = 456;
a2 = '789' || byte(10) || 'XYZ';
a3 = '987';
a4 = byte(10);
output;
run;
proc contents noprint data=have out=have_meta;
run;
proc sql noprint;
select
cats(name,'= char',name),
cats(name,'= input(char', name,',??best12.);'),
'char'||name
into
:rename separated by ' ',
:convert separated by ' ',
:drop separated by ' '
from have_meta
where
type=2 and
(substr(name,1,1) in ('a', 'A')) /* the characters of the A-team :) */
;
quit;
options symbolgen;
data want(drop=&drop);
set have (rename=(&rename));
&convert
run;
options nosymbolgen;