在 SAS proc-sql 中将数据分组

Posted

技术标签:

【中文标题】在 SAS proc-sql 中将数据分组【英文标题】:divide data into groups in SAS proc-sql 【发布时间】:2015-07-07 09:05:45 【问题描述】:

我需要在 SAS proc-sql 中创建一些循环,将数据分组。 我有数据

ID1     ID2 TIME                    GROUP
1234    12  22MAY2015:16:10:00.000  0
1234    12  22MAY2015:16:15:00.000  0
1234    12  12JUN2015:6:35:00.000   0
1234    12  12JUN2015:16:35:00.000  0
6549    45  15APR2015:16:10:00.000  0
6549    45  18APR2015:13:15:00.000  0
6549    45  18APR2015:13:18:00.000  0
6549    15  22MAY2015:14:15:00.000  0
6549    15  22MAY2015:14:20:00.000  0

并且我需要创建新列 GROUP,对于那些具有相同 ID1、相同 ID2 且 TIME 之间的差异最大为 10 分钟的行,该列将具有相同的 ID。

结果将是:

ID1     ID2 TIME                    GROUP
1234    12  22MAY2015:16:10:00.000  1
1234    12  22MAY2015:16:15:00.000  1
1234    12  12JUN2015:6:35:00.000   2
1234    12  12JUN2015:16:35:00.000  3
6549    45  15APR2015:16:10:00.000  4
6549    45  18APR2015:13:15:00.000  5
6549    45  18APR2015:13:18:00.000  5
6549    15  22MAY2015:14:15:00.000  6
6549    15  22MAY2015:14:20:00.000  6

我尝试编写一些“do while”循环,但它不起作用。

data b;
set a;
time1 = time;
id1_1 = id1;
id2_1 = id2;
time2 = time;
id1_2 = id1;
id2_2 = id2;
group = group+1;
do while (id1_1 eq id1_2 id2_1 eq id2_2 floor((time2-time1)/60)<=10);
group = group;
time2 = time;
id1_2 = id1;
id2_2 = id2;
end;
run;

非常感谢。

【问题讨论】:

欢迎来到 SO,如果您发布您看到的任何错误消息,或者您解释为什么您编写的代码无法按预期工作,您将获得更好的响应。 嗨,这段代码正在运行,没有输出。在我看来,它是循环的。当我将它更改为直到它收到一些结果但在一个组列中每一行的数字相同。不知道这个方法好不好。我没有使用循环的经验,所以我认为有更好的方法或不同的方法来做到这一点。 【参考方案1】:

Proc SQL 不是解决您的问题的合适工具。您已经考虑过“循环”,这是一个好的开始。但是,您的代码中缺少的元素是“滞后”概念以及其他一些细节。您的分组条件有两部分:1)基于ID1,ID2的自然组2)在1)的基础上,如果TIME相隔超过10分钟,则会生成额外的组。

data have;
    input (ID1     ID2) (:$8.) TIME:datetime23.;
    format TIME:datetime23.;
    cards;
1234    12  22MAY2015:16:10:00.000  1
1234    12  22MAY2015:16:15:00.000  1
1234    12  12JUN2015:6:35:00.000   2
1234    12  12JUN2015:16:35:00.000  3
6549    45  15APR2015:16:10:00.000  4
6549    45  18APR2015:13:15:00.000  5
6549    45  18APR2015:13:18:00.000  5
6549    15  22MAY2015:14:15:00.000  6
6549    15  22MAY2015:14:20:00.000  6
;

data want;
    group+1; /*condition part 1*/

    do until (last.id2);
        set have;
        by id1 id2 notsorted;
        lag_time=lag(time);

        if not first.id2 then group+intck('minute',lag_time,time)>10; /*condition part 2*/
            output;
    end;

    drop lag_time;
run;

【讨论】:

非常感谢您的解释和有用的代码。它有效。

以上是关于在 SAS proc-sql 中将数据分组的主要内容,如果未能解决你的问题,请参考以下文章

在 SAS 中将数字数组提高到幂

如何用sas 随机分层分组

SAS:在where子句中将日期时间转换为日期

SAS中如何分组计数,并将值保存到宏变量

sas first.variable啥意思

我们如何在 SQL 中将连续数据分组为单个日期跨度?