SAS按顺序查找变量
我需要找出谁拥有A-B-C订单。例如,请查看表格SAS按顺序查找变量,sas,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
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和15
输出应该是
id term subj
11 2005 232
15 2010 130
所以我需要列出等级为“A”的id,然后改为“B”,然后改为“C”。
Num可能是正常的。它不必从1开始,它可以是1、2或3,等等,但它应该是顺序A、B、C
我不需要看到ID=20的bec,因为num order grades'不符合顺序。如果您只需要一个简单的'a'-'B'-'C'序列,那么
LAG()
函数就足够了。这就是我在下面的例子中所展示的。如果您正在寻找更多的序列(例如“A”-“B”,“B”-“C”,“A”-“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 (grade = 'C' AND LAG1(grade) = 'B' AND LAG2(grade) = 'A');
这在本例中确实有效,但一般来说,最好养成在IF
条件之外调用LAG()
并将结果存储在临时变量中的习惯。如果您只需要一个简单的'a'-'B'-'C'序列,那么LAG()
函数就足够了。这就是我在下面的例子中所展示的。如果您正在寻找更多的序列(例如“A”-“B”,“B”-“C”,“A”-“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 (grade = 'C' AND LAG1(grade) = 'B' AND LAG2(grade) = 'A');
这在本例中确实有效,但一般来说,最好养成在IF
条件之外调用LAG()
并将结果存储在临时变量中的习惯。您的示例输出不显示等级。在我看来,您只需要包含“A”-“B”-“C”序列的记录集的id
、术语和sub
,不是吗?另外,我缩短了代码。是的,正如你提到的,它不符合顺序。为了“num”,我需要这个。如果我删除“如果”(grade'部分,我需要添加什么?不要担心第一条评论,我删除了。我犯了错误。但我需要输出的顺序是A,然后是B,然后是COK,这与当前的样本输出不同。你是说你想要每个'A'-'B'-'C'序列的所有记录吗?如果是,请更改样本输出,以便我确定你的意思和n我会继续修改答案。我修改了。我又添加了一个id=20,我不需要看到它。因为它不符合顺序。清楚吗?你的样本输出没有显示分数。在我看来,你似乎只需要包含“A”-“B”-“C”序列的记录集的id
、term
和subc
,不?而且,我缩短了内德的代码。是的,正如你提到的,它是不符合顺序的。我需要在顺序'num'。如果我删除'if'(grade'部分,我需要添加什么?不要担心第一条评论,我删除了。我犯了错误。但我需要输出的顺序是A,然后是B,然后是COK,这与当前的样本输出不同。你是说你想要每个'A'-'B'-'C'序列的所有记录吗?如果是,请更改样本输出,以便我确定你的意思和我会继续改变答案。我改变了。我又增加了一个id=20,我不需要看到它。因为它不符合顺序。明白吗?