SAS:获取由组验证条件的第一个值
我有这个数据库:SAS:获取由组验证条件的第一个值,sas,Sas,我有这个数据库: data temp; input ID date type ; datalines; 1 10/11/2006 1 1 10/12/2006 2 1 15/01/2007 2 1 20/01/2007 3 2 10/08/2008 1 2 11/09/2008 1 2 17/10/2008 1 2 12/11/2008 2 2
data temp;
input ID date type ;
datalines;
1 10/11/2006 1
1 10/12/2006 2
1 15/01/2007 2
1 20/01/2007 3
2 10/08/2008 1
2 11/09/2008 1
2 17/10/2008 1
2 12/11/2008 2
2 10/12/2008 3
;
我想创建一个新列,在其中输入变量类型从1按ID更改为2的第一个日期,如下所示:
data temp;
input ID date type date_change_type1to2;
datalines;
1 10/11/2006 1 .
1 10/12/2006 2 10/12/2006
1 15/01/2007 2 .
1 20/01/2007 3 .
2 10/08/2008 1 .
2 11/09/2008 1 .
2 17/10/2008 1 .
2 12/11/2008 2 12/11/2008
2 10/12/2008 3 .
;
我尝试过此代码,但不起作用:
data temp;
set temp;
if first.type= 2 then date_change_type1to2=date;
by ID;
run;
提前感谢您的帮助 如果未在
by
语句中包含type
,则不会创建变量first.type
。即使它确实存在,它的值也永远不会是2,它的值将是1(真)或0(假)
如果您只想设置它,并在该ID的其余观察中保留其值,则可以保留该值。请确保在启动新ID值时将其清除
data temp;
set temp;
by ID;
if first.id then date_change_type1to2=.;
retain date_change_type1to2 ;
if type=2 and missing(date_change_type1to2) then date_change_type1to2=date;
run;
解决方案(必须对输入数据进行排序!):
输出:
+----+------------+------+----------------------+
| ID | date | type | date_change_type1to2 |
+----+------------+------+----------------------+
| 1 | 10/11/2006 | 1 | |
+----+------------+------+----------------------+
| 1 | 10/12/2006 | 2 | 10/12/2006 |
+----+------------+------+----------------------+
| 1 | 15/01/2007 | 2 | |
+----+------------+------+----------------------+
| 1 | 20/01/2007 | 2 | |
+----+------------+------+----------------------+
| 2 | 10/08/2008 | 1 | |
+----+------------+------+----------------------+
| 2 | 11/09/2008 | 1 | |
+----+------------+------+----------------------+
| 2 | 17/10/2008 | 1 | |
+----+------------+------+----------------------+
| 2 | 12/11/2008 | 2 | 12/11/2008 |
+----+------------+------+----------------------+
| 2 | 10/12/2008 | 2 | |
+----+------------+------+----------------------+
谢谢你的回答!我可以在您的代码中精确计算变量“type”的值2吗?因为我有许多其他类型(3,4,5),我只想找到类型从1变为2的第一个日期?@sdhaoui是的,请检查答案:)太好了!非常感谢你!如果值更改为2,然后更改为其他值,然后又更改回2,该怎么办?是否应标记/选择这两个日期?如果ID的第一个值是2怎么办?@Tom我没有这两种情况,但如果其他用户想要使用下面建议的代码,这是一个值得考虑的问题!首先感谢
。不管怎样,键入的都将是有效的PDV项目。当BY
语句中指定了type
时,只有与分组一致的0或1标志值自动赋值。未指定,非由首先指定。
引用注释:d为未初始化,但值为0.5。First.type将被取消初始化,并且它将从输出数据集中排除。这可能是一个偶然的特性,说明了代码是如何编写的,并且仍然保留着以确保向后兼容性。
+----+------------+------+----------------------+
| ID | date | type | date_change_type1to2 |
+----+------------+------+----------------------+
| 1 | 10/11/2006 | 1 | |
+----+------------+------+----------------------+
| 1 | 10/12/2006 | 2 | 10/12/2006 |
+----+------------+------+----------------------+
| 1 | 15/01/2007 | 2 | |
+----+------------+------+----------------------+
| 1 | 20/01/2007 | 2 | |
+----+------------+------+----------------------+
| 2 | 10/08/2008 | 1 | |
+----+------------+------+----------------------+
| 2 | 11/09/2008 | 1 | |
+----+------------+------+----------------------+
| 2 | 17/10/2008 | 1 | |
+----+------------+------+----------------------+
| 2 | 12/11/2008 | 2 | 12/11/2008 |
+----+------------+------+----------------------+
| 2 | 10/12/2008 | 2 | |
+----+------------+------+----------------------+