【问题标题】:SAS not reaching conditional clause despite conditions being met尽管满足条件,SAS仍未达到条件条款
【发布时间】:2014-12-09 22:02:18
【问题描述】:

这是我在 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 知识,这解释了为什么在从项目流程中的前一个节点设置数据的情况下,这可能不起作用。

非常感谢任何帮助!

【问题讨论】:

  • 一个问题:您是否 100% 确定 prev_aprev_b 不存在于 work.temp2 数据集中?它们必须不在此数据集上,否则将不起作用。
  • @Joe 我敢肯定,但尽管如此,我还是将程序指向了一个新创建的 work.temp2 副本,名为 work.temp3,这似乎让我找到了我需要去的地方的一部分(有关详细信息,请参阅我对 Robert Penridge 的回复。谢谢!

标签: sas


【解决方案1】:

我觉得不错。在我下面的测试数据中,只有 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;

您的代码(注意 - 我添加了一个 output 语句,以在 prev_a 和 prev_b 的最终分配之前将变量的内容显式写入数据集。这样可以更轻松地查看 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;

【讨论】:

  • 我想我离解决方案越来越近了。按照 Joe 的观点,我将程序指向一个新创建的中间数据集 work.temp3,即使 prev_a 和 prev_b 在 work.temp2 中不存在。这至少产生的不仅仅是 N 的标志,但 Y 总是出现在它们应该出现的位置之前的一行。因此,在您的示例中,Y 将出现在 C 行。有一个 PROC SORT 在数据步骤之前立即调用,它按单独的时间变量降序排序,但这应该没问题。我尝试将降序更改为升序,但 SAS 无法识别该关键字。谢谢!
猜你喜欢
  • 2021-05-22
  • 2012-09-16
  • 1970-01-01
  • 1970-01-01
  • 2023-04-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多