我是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行包含输入语句。
答案 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;