SAS - 在列值不变时执行循环
SAS - Do a loop while a column value doesn't change
我正在尝试通过 SAS guide 使用循环(通过 PROC LOOP)在特定列的值发生变化时创建一个具有增量 ID 的新列。
举个例子,我正在寻找这样的东西:
日期 |名称 |状态 | ID
------------------------------------------
20150101 |蒂亚戈 |单身 | 1个
20150102 |蒂亚戈 |单身 | 1个
20150103 |蒂亚戈 |已婚 | 2个
20150104 |蒂亚戈 |离婚 | 3个
20150105 |蒂亚戈 |离婚 | 3个
20150106 |蒂亚戈 |已婚 | 4个
在这种情况下,新列将是 ID,只要记录的状态发生变化,该 ID 就会递增。这样我就可以按名称分组,以查看及时发生的每个更改(即使它们重复)。
这个问题好像有点糊涂。如果原始数据已经使用提供的示例数据进行排序,则可以执行这样的数据步骤。
data new;
set test;
by status notsorted;
if first.status then id + 1;
run;
notsorted选项用于保留原始数据。 first.status 状态的首次出现将为 True。 id + 1 是一个总结语句。汇总语句中的变量未初始化为缺失
顺便问一下,什么是 PROC LOOP?
扩展 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;
我正在尝试通过 SAS guide 使用循环(通过 PROC LOOP)在特定列的值发生变化时创建一个具有增量 ID 的新列。
举个例子,我正在寻找这样的东西:
日期 |名称 |状态 | ID ------------------------------------------ 20150101 |蒂亚戈 |单身 | 1个 20150102 |蒂亚戈 |单身 | 1个 20150103 |蒂亚戈 |已婚 | 2个 20150104 |蒂亚戈 |离婚 | 3个 20150105 |蒂亚戈 |离婚 | 3个 20150106 |蒂亚戈 |已婚 | 4个
在这种情况下,新列将是 ID,只要记录的状态发生变化,该 ID 就会递增。这样我就可以按名称分组,以查看及时发生的每个更改(即使它们重复)。
这个问题好像有点糊涂。如果原始数据已经使用提供的示例数据进行排序,则可以执行这样的数据步骤。
data new;
set test;
by status notsorted;
if first.status then id + 1;
run;
notsorted选项用于保留原始数据。 first.status 状态的首次出现将为 True。 id + 1 是一个总结语句。汇总语句中的变量未初始化为缺失
顺便问一下,什么是 PROC LOOP?
扩展 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;