SAS相同的逻辑应用于变量列表?

时间:2017-10-20 18:49:24

标签: sas range

我正在尝试对所有变量应用相同的逻辑,并根据逻辑创建一个新变量:

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范围内的每个变量的文件。

1 个答案:

答案 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-var25n_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是一种常见的方式,但如果你想走这条路,可能值得一个单独的问题。