我有一个 SAS 数据集,其中包含我正在尝试使用的季度数据。我已经上传了 5 年前的历史数据,我将获得季度数据,这些数据将在全年继续滚动。
例如今年2023年
结束日期 | 团体 |
---|---|
6 月 30 日至 23 日 | 商业 |
6 月 30 日至 23 日 | 商业 |
我将收到的下一个数据集将包含结束日期为 9 月 30 日的数据行。
我如何才能从之前的数据集中删除行,并将其替换为 SAS 中 9 月份的新滚动数据?
谢谢!
抱歉,我对 SAS 很陌生,所以到目前为止我所做的就是导入文件,但在创建带有日期的宏时坚持使用所有日期参数,然后删除/替换行
有很多方法可以做到这一点,从最简单、最慢到最快、更复杂。您的数据越大,您就越有可能需要执行此操作的高效版本。 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;
这不是最有效的方法,因为您必须读取每个数据集的每一行
如果您想提高效率,请执行以下操作:
日期索引将使 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 语句覆盖数据集。您只能使用修改或追加操作。这样做会破坏索引,需要重新创建。