如何在 SAS 中用最新日期替换行

问题描述 投票:0回答:1

我有一个 SAS 数据集,其中包含我正在尝试使用的季度数据。我已经上传了 5 年前的历史数据,我将获得季度数据,这些数据将在全年继续滚动。

例如今年2023年

结束日期 团体
6 月 30 日至 23 日 商业
6 月 30 日至 23 日 商业

我将收到的下一个数据集将包含结束日期为 9 月 30 日的数据行。

我如何才能从之前的数据集中删除行,并将其替换为 SAS 中 9 月份的新滚动数据?

谢谢!

抱歉,我对 SAS 很陌生,所以到目前为止我所做的就是导入文件,但在创建带有日期的宏时坚持使用所有日期参数,然后删除/替换行

sas
1个回答
0
投票

有很多方法可以做到这一点,从最简单、最慢到最快、更复杂。您的数据越大,您就越有可能需要执行此操作的高效版本。 SAS 在处理大数据时通常非常快,所以我会首先采取最简单的路线。

最简单的方法

最简单的方法是使用

where
语句完全覆盖数据集。这是存储在库中的永久数据集的最简单形式
foo
:

data foo.have;
    set foo.have(where=(date < '30JUN2023'd))
        new
    ;
run;

现在您需要做的就是将该硬编码日期转换为动态日期。最简单的方法是使用

proc sql
并获取新数据的最小日期并将其保存到宏变量中。在下面的示例中,
&min_date
保存您正在读取的新数据集中的最小日期。我们将在我们的
where
声明中使用它:

proc sql noprint;
    select min(date)
    into :min_date
    from new;
quit;

data foo.have;
    set foo.have(where=(date < &min_date))
        new
    ;
run;

这不是最有效的方法,因为您必须读取每个数据集的每一行

高效方法

如果您想提高效率,请执行以下操作:

  1. 为您的主要数据集创建日期索引
  2. 从新数据中获取最短日期
  3. 就地修改主数据集以删除旧行
  4. 将新行追加到主数据集

日期索引将使 SAS 能够非常快速地查找和删除主数据集中感兴趣的行。

/* 1. Create an index on the dataset in the library 'foo'.
      You only need to do this once. */
proc datasets lib=foo nolist;
    modify have;
        index create date;
quit;

/* 2. Get the min date from the new data */
proc sql noprint;
    select min(date)
    into :min_date
    from new;
quit;

/* 3. Remove the old data */
data foo.have;
    modify foo.have;
    where date GE &min_date;
    remove;
run;

/* 4. Append the new data */
proc append base=foo.have data=new force;
run;

请记住,您不得使用 set 语句覆盖数据集。您只能使用修改或追加操作。这样做会破坏索引,需要重新创建。

© www.soinside.com 2019 - 2024. All rights reserved.