SAS查找顺序变量

时间:2016-05-05 17:54:11

标签: sas

我需要找到A-B-C顺序的人。请查看表格,例如;

 id          term        grade      subj      num
 10         2002        D            332        1 
 10         2002        A             333      2
 11         2005        C             232       1 
 11         2005        A             232       2
 11         2005        B             232       3
 11         2005        C             232       4
 15         2010       A              130       1
 15         2010       B               130      2
 15         2010       C              130       3 
 20         2000       B             500        1
 20         2000       A             500        2
 20         2000       C             500        3    

我需要从这张表中得到的是id:11 AND 15

输出应该像

   id   term   subj
   11   2005   232
   15  2010    130 

所以我需要列出其中包含“A”等级的ID,然后将其更改为“B”,然后将其更改为“C”。 Num可能是有序的。它不必从1开始,它可以是1或2或3等。但它应该是顺序A然后B然后C 我不需要看到ID = 20因为num order等级'不合适。

1 个答案:

答案 0 :(得分:0)

如果您正在寻找的只是一个简单的' - ' B' - ' C'序列,然后LAG()函数就足够了。这就是我在下面的例子中展示的内容。如果您正在寻找更多序列(例如' A' - ' B',' B' - ' C',' A& #39; - ' B' - ' C' - ' D'),需要稍微复杂的解决方案。如果是这样,我会相应地编辑答案。

以下是显示实施的测试程序:

DATA d1;
    INPUT
        id  :8.
        term    :8.
        grade   :$2.
        subj    :8.
        num     :8.
    ;

    DATALINES;
         10         2002        D            332        1 
         10         2002        A             333      2
         11         2005        C             232       1 
         11         2005        A             232       2
         11         2005        B             232       3
         11         2005        C             232       4
         15         2010       A              130       1
         15         2010       B               130      2
         15         2010       C              130       3 
    ;
RUN;



DATA d2 (
    KEEP = id term subj
);
    SET d1;

    grade_previous_1 = LAG1(grade);
    grade_previous_2 = LAG2(grade);

    IF (grade = 'C' AND grade_previous_1 = 'B' AND grade_previous_2 = 'A');
RUN;

请注意,LAG函数必须按照自己的行进行评估并存储在变量中,如上所示 - 不要将它们折叠到IF条件中,否则它们不会被取消永远都会被执行也就是说,不要说:

IF (grade = 'C' AND LAG1(grade) = 'B' AND LAG2(grade) = 'A');

这实际上适用于此示例,但一般来说,养成在LAG()条件之外调用IF并将结果存储在临时变量中的习惯会更好。