我正在尝试对所有变量应用相同的逻辑,并根据逻辑创建一个新变量:
DATA want;
SET have;
IF "range" = 25 THEN "new range" = 1
ELSE "new range" = 0;
RUN;
如果更容易,我也可以自己更改变量,而不是从逻辑语句创建新变量。
作为一个例子,我希望变量25中的任何值都是1,其他一切都是0:
HAVE:
var_100 var_101 var_102
30 25 20
45 100 25
25 25 10
WANT:
var_100 var_101 var_102
0 1 0
0 0 1
1 1 0
所以我有大约100个具有相同前缀且增加的变量。而不是写100个逻辑。我正在尝试编写一个适用于var_1到var_100范围内的每个变量的文件。
答案 0 :(得分:1)
很多你可以做到这一点,主要是基于你正在做什么做什么。
阵列是最简单的:
data want;
set have;
array vars[25] var1-var25;
array newvars[25] n_var1 - n_var25;
do _i = 1 to dim(vars);
if vars[_i] = 25 then newvars[_i] = 1;
else newvars[_i] = 0;
end;
run;
当然,您需要一些合理的方法来指定这些变量列表(var1-var25
和n_var1 - n_var25
);如果它们不仅仅是顺序的,你要么必须全部写出来,要么用宏语言来做。
另一种方法是编写一个宏来做你想做的事。
%macro recode(invar=, outvar=, inval=, outval=, otherval=);
if &invar. = &inval. then &outvar. = &outval.;
else &outvar. = &otherval.;
%mend recode;
data want;
set have;
%recode(invar=var1, outvar=n_Var1, inval=25, outval=1, otherval=0);
.. 25 of these ..
run;
然后,您可以使用代码生成这些宏调用;在这里或在搜索引擎上搜索“sas数据驱动编程”以获取示例。
如果25 - > 1变量的变化。前者更好,如果没有,变量很容易“可列表”(如var1-var25)。如果它们不可列出,但25-> 1是固定的,那么我认为其中任何一个都是相同的。
当然,除了使用newvars之外,您还可以重新编码var [_i] = 1或其他任何内容,如果这更容易。
顺便说一句,如果你正在使用procs做什么,那么还有更简单的方法将变量编码为1/0标志。我认为PROC SCORE是一种常见的方式,但如果你想走这条路,可能值得一个单独的问题。