SAS - 在列值没有变化时进行循环

时间:2015-02-02 12:03:13

标签: loops sas do-while

我尝试通过SAS指南使用循环(通过PROC LOOP),只要特定列的值发生变化,就可以使用增量ID创建新列。

仅举例来说,我正在寻找类似的东西:

Date     | Name  | Status   | ID
------------------------------------------
20150101 | Tiago | Single   | 1

20150102 | Tiago | Single   | 1

20150103 | Tiago | Married  | 2

20150104 | Tiago | Divorced | 3

20150105 | Tiago | Divorced | 3

20150106 | Tiago | Married  | 4

在这种情况下,新列将是ID,只要状态沿记录更改,它就会递增。有了这个,我可以按名称分组,查看及时发生的每一个变化(即使它们被重复)。

2 个答案:

答案 0 :(得分:2)

这个问题似乎有点困惑。如果原始数据已经与提供的样本数据一起排序,则可以执行这样的数据步骤。

data new;
    set test;
    by status notsorted;
    if first.status then id + 1;
run;

notsorted选项用于保留原始数据。 first.status将首次出现状态为True。 id + 1是摘要声明。摘要语句中的变量未初始化为缺失。

顺便问一下,什么是PROC LOOP?

答案 1 :(得分:0)

扩展Dajun的答案,按名称分组。

/* Sort so that name forms groups and id will go in date order */
proc sort data = test;
    by name date;
run;

data want;
    set test;
    /* Tell SAS we want to know when the value of name or status changes */
    by name status notsorted;
    /* Reset the ID for each group */
    if first.name then id = 0;
    /* iterate the ID as per DaJun */
    if first.status then id + 1;
run;