SAS /使用数组将多个字符变量转换为数字

时间:2016-02-15 23:27:48

标签: arrays sas

我是SAS新手。我试图将字符变量转换为数字。下面的代码适用于一个变量,但我需要同时转换50个以上的变量。数组会解决这个问题吗?如果是这样,我将如何编写语法?

DATA conversion_subset;
SET have;
new_var = input(oldvar,4.); 
drop oldvar; 
rename newvar=oldvar;
RUN;

@Reeza

DATA conversion_subset;
SET have;

Array old_var(*) $ a_20040102--a_20040303 a_302000--a_302202;
* The first list contains 8 variables. The second list contains 7 variables;
Array new_var(15) var1-var15;

Do i=1 to dim(old_var);
 new_var(i) = input(old_var(i),4.); 
End;

*drop a_20040102--a_20040303 a_302000--a_302202; 
*rename var1-var15 = a_20040102--a_20040303 a_302000--a_302202;
 RUN;  

注意:第64行第19行的函数INPUT的参数无效 (new_var(i)= input(old_var(i),4。)

@Reeza

我仍然坚持这个阵列。非常感谢您的帮助。我的代码:

DATA conversion_subset (DROP= _20040101 _20040201 _20040301);
SET replace_nulls;
Array _char(*) $ _200100--_601600;
Array _num(*) var1-var90;
Do i=1 to dim(_char);
 _num(i) = input(_char(i),4.); 
End;
RUN;

我收到以下错误:错误:数组下标超出了第64行第6行的范围。第64行包含输入语句。

2 个答案:

答案 0 :(得分:0)

正如@Parfait建议的那样,最好在获得它时调整它,而不是在它已经存在于SAS数据集中之后。但是,如果您获得了数据集并且必须转换它,那就是您必须要做的事情。您可以向PROC SQL添加WHERE子句以排除不应转换的变量。如果这样做,它们将不在最终数据集中,除非您在CREATE TABLE的SELECT子句中添加它们。

PROC CONTENTS DATA=have OUT=havelist NOPRINT ;
RUN ; %* get variable names ;

PROC SQL ;
  SELECT 'INPUT(' || name || ',4.) AS ' || name
    INTO :convert SEPARATED BY ','
    FROM havelist
  ; %* create the select statement ;

  CREATE TABLE conversion_subset AS
    SELECT &convert
    FROM have
  ;
QUIT ;

如果排除变量是一个问题和/或您想使用DATA步骤,那么请使用上面的PROC CONTENTS并按照以下步骤操作:

PROC SQL ;
  SELECT COMPRESS(name || '_n=INPUT(' || name || ',4.)'),
         COMPRESS(name || '_n=' || name),
         COMPRESS(name)
    INTO :convertlst SEPARATED BY ';',
         :renamelst SEPARATED BY ' ',
         :droplst SEPARATED BY ' '
    FROM havelist
  ;
QUIT ;

DATA conversion_subset (RENAME=(&renamelst)) ;
  SET have ;
  &convertlst ;
  DROP &droplst ;
RUN ;

再次添加where子句以排除不应转换的变量。这将自动保留您在PROC SQL SELECT中使用WHERE从转换中排除的任何变量。

如果你有太多的变量,或者它们的名字很长,或者在末尾添加_n会导致名称冲突,那么事情可能会很糟糕(宏变量数据太多,非法字段名称,一个字段覆盖另一个字段,分别地)。

答案 1 :(得分:0)

是的,数组解决了这个问题。您将需要一种简单的方法来列出变量,以便查看SAS变量列表。例如,如果您在第一个和最后一个之间转换所有字符变量,则可以将它们列为first_var-character-last_var。

在SO中的其他问题中说明了重命名/删除。

DATA conversion_subset;
 SET have;
 Array old_var(50) $ first-character-last;
 Array new_var(50) var1-var50;
 Do i=1 to 50;
     new_var(i) = input(oldvar(i),4.); 
  End;
 RUN;