【问题标题】:Adding rows of missing data in SAS在 SAS 中添加缺失数据行
【发布时间】:2014-10-10 18:44:56
【问题描述】:

考虑名为 test 的数据集的以下架构:

 id   time  pulse
 1    0      120
 1    5      100
 1    10     80
 1    15     50
 2    0      110
 2    5      70
 2    10     60
 3    0      114
 .    .      .
 .    .      .

请注意,id 2 缺少时间 15。我想为 id 2 添加一行,显示时间 15 和脉冲列中的缺失值 (NA)。我想对所有缺少值的 id 执行此操作。我将如何在 SAS 中执行此操作?

【问题讨论】:

    标签: sas


    【解决方案1】:

    根据您的数据集有多大,您可以使用 PROC Summary 中的 COMPLETETYPES 选项为您执行此操作。这在内存中运行,可能会导致非常大的数据集出现问题。

    data have;
    input id   time  pulse;
    datalines;
     1    0      120
     1    5      100
     1    10     80
     1    15     50
     2    0      110
     2    5      70
     2    10     60
     3    0      114
     .    .      .
     .    .      .
     ;
     run;
    
     proc summary data=have nway completetypes;
     class id time;
     id pulse;
     output out=want (drop=_:);
     run;
    

    【讨论】:

    • 嗨,Keith,想阅读更多关于此的内容,所以我查看了 proc 方法文档,并发现:“使用 COMPLETETYPES 不会增加内存需求。”你有更多关于完整类型如何影响内存的信息吗?来源:support.sas.com/documentation/cdl/en/proc/61895/HTML/default/…
    • 与其说是 COMPLETETYPES 选项,不如说是 PROC Summary,尤其是在使用 ID 语句时。在这种情况下,只有一个变量,但我发现如果你放入多个变量,它可能会导致内存故障。
    【解决方案2】:

    您可以使用lag 函数来拉出上一次。如果您知道时间以固定顺序(0、5、10、15)发生,那么通过将当前行中的时间与滞后值进行比较,您就知道是否需要插入新行。这可以通过output 函数来完成

    【讨论】:

      【解决方案3】:

      我想说proc transpose 非常适合您的情况。它会在将数据从长格式更改为宽格式时为您填充缺失的值。

      PROC TRANSPOSE DATA=HAVE OUT=WANT (drop=_name_);
          VAR PULSE;
          BY ID;
          ID TIME; 
      RUN;
      

      那么你只需要将数据WANT改回长格式即可。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-12-22
        • 2021-10-05
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-02-15
        • 2021-04-06
        • 1970-01-01
        相关资源
        最近更新 更多