SAS根据比较他人创建列

SAS create column based on comparing others

我有以下数据:

data temp;
input id int1 int2 char1$ char2$;
cards;
1 2 3 AA BB
2 3 3 AB CC
3 4 5 AC DD
4 5 5 AD AD
5 6 7 AE FF
6 7 8 AF GG
;
run;

我想创建一个新列“差异”,它是比较 int1 和 int2 以及 char1 和 char2 的结果,“差异”在差异函数中是递增的:

我想要这样的结果:

data result;
input id int1 int2 char1$ char2$ differences;
cards;
1 2 3 AA BB 2
2 3 3 AB CC 1
3 4 5 AC DD 2
4 5 5 AD AD 0
5 6 7 AE FF 2
6 7 8 AF GG 2
;
run;

在那个例子中,只有 4 列,但我在原始数据中有 36 列。 我开始尝试循环,我不知道它是否是解决pb的正确方法:

data result;
    SET temp;
    array id int1 int2 char1 char2;

    DO i = 1 to dim(id);
        DIFFERENCE = 0;
        if int1           ^= int2           THEN DIFFERENCE = DIFFERENCE + 1;
        if char1         ^= char2         THEN DIFFERENCE = DIFFERENCE + 1;

    END;
RUN;

但这行不通,你有什么想法吗?

非常感谢!

根据您的结果 table 我推测当 int1 = int2 and char1 != char2.

时差值也应等于 1

在那种情况下,简单地使用 IFN() 函数应该会输出所需的结果。

data result;
    set temp;
    difference = ifn(int1=int2 and char1=char2, 0, ifn((int1 ne int2 and char1 = char2) or (int1 = int2 and char1 ne char2), 1, 2));
run;


编辑:DD Chen 评论后

data result;
    set temp;
    do i=1 to _n_;
        difference = 0;
        if int1 ne int2 then difference + 1;
        if char1 ne char2 then difference + 1;
        /* add all comparison statements ... */
    end;
    drop i;
run;

SAS 会将布尔表达式计算为 1 (TRUE) 或 0 (FALSE)。

因此,要获得输出,您只需要做:

data want;
  set temp;
  difference = (int1 ne int2) + (char1 ne char2);
run;