【问题标题】:New variable per ID using different observations in SAS使用 SAS 中的不同观察值的每个 ID 的新变量
【发布时间】:2016-06-24 18:29:02
【问题描述】:

我在 SAS 中有以下数据。变量 strdat 显示一些值,例如 99979797 用于相同 id 的二阶或更高阶观察值。我想使用来自先前观察 + 7 天的变量 enddat 替换这些观察。例如,对于 id=2,第二个观察 strdat 必须更改为 20050808。

原始数据

data data_b;
input id obs strdat enddat
;
datalines;
1 1 20061130 20081215 
2 2 99979797 20070905 
2 1 20010215 20050801 
3 3 20100115 20101231 
3 2 20060203 20070601
3 1 20041115 20050202
4 3 99979797 20101231
4 2 20060101 20060205
4 1 20050810 20051010
5 1 20041201 20050614
5 2 20060105 20060301
5 3 20061015 20090606
run;

期望的输出

1 1 20061130 20081215 
2 2 20050808 20070905 
2 1 20010215 20050801 
3 3 20100115 20101231 
3 2 20060203 20070601
3 1 20041115 20050202
4 3 20060212 20101231
4 2 20060101 20060205
4 1 20050810 20051010
5 1 20041201 20050614
5 2 20060105 20060301
5 3 20061015 20090606

【问题讨论】:

  • 请发布您尝试过的内容以及您的预期输出。如果您有与您的问题无关的无关变量,也请删除它们。

标签: sas


【解决方案1】:

首先将无效日期更改为缺失,将它们读取为 SAS 日期,并按 ID、OBS 排序。然后,您可以使用 UPDATE 用之前的结束日期 + 7 来填充缺失的开始日期。我会留给您参考文档,了解 UPDATE 如何处理缺失值以及为什么会这样。

data b;
   input id obs (strdat enddat)(:??yymmdd.);
   format strdat enddat yymmddd10.;
   datalines;
1 1 20061130 20081215 
2 2 99979797 20070905 
2 1 20010215 20050801 
3 3 20100115 20101231 
3 2 20060203 20070601
3 1 20041115 20050202
4 3 99979797 20101231
4 2 20060101 20060205
4 1 20050810 20051010
5 1 20041201 20050614
5 2 20060105 20060301
5 3 20061015 20090606
   run;
proc sort;
   by id obs;
   run;
data c;
   update b(obs=0) b;
   by id;
   output;
   strdat = enddat + 7;
   run;

【讨论】:

    【解决方案2】:

    为每个 id 保存第二个最新的 enddat:

    proc sql;
        create table data_b2 as select distinct
            id, max(enddat) + 7 as new_enddat
            from data_b (where = (strdat ~= 99979797))
            group by id;
    quit;
    

    将它们重新附加到主表,在适当的地方替换 strdat:

    proc sql;
        create table data_b3 as select distinct
            a.id, a.obs,
            case when a.strdat = 99979797 then b.new_enddat else a.strdat end as strdat,
            a.enddat
            from data_b as a
            left join data_b2 as b
            on a.id = b.id
            order by a.id, a.obs desc;
    quit;
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-05-03
      • 2023-01-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-12-03
      相关资源
      最近更新 更多