从数字列变量中删除无效的字符串条目(\ n)

时间:2019-07-13 04:15:38

标签: sas sas-macro

我有一组A1-A54列。所有这些列都应设置为数字格式。但是,这些列中的某些条目存储为“ \ N”,这会破坏列格式,并且不允许在列上运行诸如proc means之类的操作。想了解如何通过在所有列上运行循环来将这些值设置为丢失。

我尝试在所有列上使用数组 numeric 运行do循环,但是由于某些列中存在\ N,它们正被格式化为字符串变量,并且数组方法无法正常工作。

array nums[*] _numeric_;
if nums[i]='\N' then nums[i]=.;
end;

这不是将\ N转换为缺少的值,因为SAS将其解释为数字变量中的字符串并引发错误。

在“数值”列中找到错误字符串变量。在运行循环时。

1 个答案:

答案 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;