【问题标题】:longitudinal calculation in SAS with lag function [duplicate]具有滞后函数的SAS中的纵向计算[重复]
【发布时间】:2014-07-21 16:15:06
【问题描述】:

您好,我有一个列中的数据。并且患者访问

一些患者就诊没有记录值。我想复制以前的就诊值。我正在使用不工作任何想法的滞后功能?

数据是这样的

ID value 
A   22
A   . 
A   23
B   . 
B   12
C   3
C  .
C  .
C  .
C  21

所需的输出。,

ID value 
A   22
A   22 
A   23
B   23 
B   12
C   3
C   3
C   3
C   3
C  21

【问题讨论】:

  • 能贴出代码吗?
  • 啊哈,终于找到副本了。需要更好的搜索词。

标签: sas


【解决方案1】:

您将在此处使用 RETAIN 而不是 LAG。 保留:

data want;
 set have;
 retain newval;
 if not missing(oldval) then newval=oldval;
run;

如果需要相同的变量名,drop+rename 将newval 改成oldval 名称。

通常,您还会检查 ID 是否相同;您的示例跨 ID 更新,因此我将其省略,但如果您不想使用 a 值更新 b 记录,则需要添加 by id; 然后 if first.id then call missing(newval); 将其重置为每个新 ID 的开头。

【讨论】:

    【解决方案2】:

    我假设ID 字段代表您的患者 ID?并且您不想将针对患者 A 记录的值用于患者 B 等...如果是这样,那么此代码将完成这项工作:

    data test;
      infile datalines truncover;
      input ID $ value ;
    
    datalines;
    A 22
    A  
    A 23
    B  
    B 12
    C 3
    C  
    C  
    C  
    C 21
    ;
    run;
    

    先排序,这样我们就可以使用by-group处理了:

    proc sort data=test;
      by id;
    run;
    

    我更喜欢使用retain 语句而不是lag() 函数,因为使用retain 的人不太可能出错:

    data final;
      set test;
      by id;
    
      retain prev_value .;
    
      if first.id then do;
        prev_value = .;  * RESET THIS VALUE EVERY TIME WE GET TO A NEW PATIENT;
      end;
    
      if value eq . then do;
        value = prev_value; * VALUE IS MISSING SO ASSIGN THE PREVIOUS RECORDED VALUE FOR THE PATIENT AGAINST IT;
      end;
      else do;
        prev_value = value; * PATIENT HAS A NEW VALUE TO RECORD SO SAVE IT INTO THE PREV_VALUE VARIABLE;
      end;
    
    run;
    

    顺便说一下,这将与您请求的结果略有不同,因为患者 B 在第一次访问时没有提供值,因此他的第一个记录将保持为空。如果您需要用他第二次访问的值来填充它,只需按相反方向对数据集进行排序,然后对其运行相同的代码。

    【讨论】:

    • 非常感谢罗伯特。它解决了我的问题。我遇到了从以前的 ID 复制值的问题。但是这很有效。,!非常感谢
    猜你喜欢
    • 1970-01-01
    • 2016-11-21
    • 1970-01-01
    • 2021-11-05
    • 2018-12-30
    • 2017-08-15
    • 1970-01-01
    • 1970-01-01
    • 2017-11-01
    相关资源
    最近更新 更多