这是我与SAS的第一天。
我使用以下代码尝试创建一个标志,该标志标识我的数据集的行何时具有字段a
(字符)与上一行中的相应字段保持相同的属性,以及字段b
(字符)与上一行的相应字段不同:
DATA WORK.temp1;
SET WORK.temp2;
RETAIN PREV_a
PREV_b;
IF( (PREV_a = a) AND (PREV_b NE b)) THEN DO;
FLAG = "Y";
END;
ELSE
FLAG = "N";
PREV_a = a;
PREV_b = b;
RUN;
结果是该标志总是具有值" N",即使在它应具有值" Y"的情况下。我在一个数据集上测试了代码,我在前面的DATA步骤中手动构建了它,并且它在那里工作,因此我确信逻辑和语法都可以(毕竟,这非常简单)。
因此,我得出结论,我缺乏一些特殊的SAS知识,这解释了为什么在项目流程中从前一个节点设置DATA的情况下,这可能不起作用。
非常感谢任何帮助!
答案 0 :(得分:4)
对我来说很好看。在下面的测试数据中,只有行D将标志设置为“Y”。您期望输出是什么?
一些测试数据:
data temp2;
input row $ a b;
datalines;
a 1 2
b 2 3
c 3 4
d 3 5
e 3 5
f 4 5
g 5 6
h 7 8
i 7 8
;
run;
你的代码(注意 - 在最终分配prev_a和prev_b之前,我添加了一个output
语句来明确地将变量的内容写入数据集。这样可以更容易地看到发生了什么if语句:
DATA WORK.temp1;
SET WORK.temp2;
RETAIN PREV_a
PREV_b;
IF( (PREV_a = a) AND (PREV_b NE b)) THEN DO;
FLAG = "Y";
END;
ELSE
FLAG = "N";
output; /* ADDED */
PREV_a = a;
PREV_b = b;
RUN;