【问题标题】:Chaining observations in SASSAS 中的链接观察
【发布时间】:2014-07-09 17:30:46
【问题描述】:

提前感谢您提供的任何帮助。 我正在尝试通过 Type 来“链接”观察结果,这样我就可以在单个观察线上比较连续的日期和值。 当我使用下面的代码按类型精确地获得两个观察值时,我可以这样做,但问题是我不知道我将为给定类型链接多少个观察值,这不是这个问题的写入路径。

输入:

Obs  Type   Date      Value
1     A     Date_1     19
2     A     Date_2     18
3     A     Date_3     7
4     A     Date_4     3
5     B     Date_1     29
6     B     Date_2     25
7     C     Date_1     29     
.

期望的输出:

Obs  Type   Date       Value    DateB   ValueB
1     A     Date_1     19       Date_2     18
2     A     Date_2     18       Date_3     7
3     A     Date_3     7        Date_4     3
4     B     Date_1     29       Date_2     25
5     C     Date_1     29          NA      NA
.
.

仅适用于 2 个 OBS 且仅适用于值(不是日期和值)的当前代码:

DATA data_chain; 
 SET data_old; 
 RETAIN LASTREAD; 
 BY Type; 
 IF FIRST.Type THEN LASTREAD = Date;
 ELSE DateB= LASTREAD;  
 DROP LASTREAD;
RUN;

【问题讨论】:

    标签: sas retain chain


    【解决方案1】:

    简单!与自身的 firstobs=2 副本并排合并(这意味着您将 obs1 与 obs2、obs2 与 obs3 等合并),重命名为 dateb/valueb。如果您想完全复制上述内容,则需要区分一种类型只有一行和多行(因为您似乎想以不同的方式对待它们)。

    data data_old;
    input Obs  Type $ Date  $ Value;
    datalines;
    1     A     Date_1     19
    2     A     Date_2     18
    3     A     Date_3     7
    4     A     Date_4     3
    5     B     Date_1     29
    6     B     Date_2     25
    7     C     Date_1     29  
    ;;;;
    run;
    
    data data_chain;
    merge data_old data_old(rename=(date=dateb value=valueb type=typeb) drop=obs firstobs=2);
    if type ne typeb then call missing(of dateb valueb);
    run;
    

    【讨论】:

    • 感谢您的解释。您的 IF 语句拯救了这一天! “CALL MISSING (of ....)”有什么作用?
    • 如果您在一行中表示两种类型(例如,第 4 行与第 5 行合并),您不希望第二种类型值“链接”到第一种;所以call missing用来设置B变量为缺失。
    猜你喜欢
    • 2013-02-12
    • 2014-05-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多