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    |                      |
+----+------------+------+----------------------+