【问题标题】:SAS: get the first value where a condition is verified by groupSAS:获取按组验证条件的第一个值
【发布时间】:2019-09-11 15:05:49
【问题描述】:

我有这个数据库:

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       
 ;

我想创建一个新列,在其中放置变量类型按 ID 从 1 更改为 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;

提前感谢您的帮助!

【问题讨论】:

  • 如果值变为 2,然后变为其他值,然后又变为 2,该怎么办?是否应该标记/选择两个日期?如果 ID 的第一个值为 2 会怎样?
  • @Tom 我没有这两种情况,但如果其他用户想使用下面建议的代码,请考虑一下!谢谢

标签: sas


【解决方案1】:

解决方案(输入数据必须排序!):

data temp;
input ID date $10. type ;
  datalines;
 1 10/11/2006   1      
 1 10/12/2006   2      
 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    
 2 10/12/2008   2       
 ;
 run;

  data temp(drop=type_store);
     set temp;
     by ID;
     retain type_store;
     if first.id then type_store = type;
     if type ne type_store and type = 2 then do;
      date_change_type1to2=date;
      type_store = type;
     end;
  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    |                      |
+----+------------+------+----------------------+

【讨论】:

  • 感谢您的回答!我可以在您的代码中精确地确定变量“类型”的值 2,因为我有许多其他类型(3、4、5)并且我只想找到类型从 1 变为 2 的第一个日期?
  • @sdhaoui 是的,请检查答案:)
  • 太棒了!非常感谢!
【解决方案2】:

如果您没有在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;

【讨论】:

  • first.type 将是一个有效的 PDV 项目,无论如何。当在BY 语句中指定type 时,只会自动分配0 或1 标志值,与分组一致。未分配的、非 first.<varaible-name> 的引用注意:d 未初始化但值为 0。
  • 对。 First.type 将未初始化,并且从输出数据集中排除。可能是代码编写方式的一个意外特性,并且仍然保留以确保向后兼容性。
猜你喜欢
  • 2020-05-04
  • 1970-01-01
  • 2021-08-02
  • 1970-01-01
  • 1970-01-01
  • 2018-09-14
  • 2018-04-27
  • 1970-01-01
  • 2013-09-10
相关资源
最近更新 更多