【发布时间】:2018-12-25 21:09:42
【问题描述】:
我有一堆名为“haveyear”的 SAS 数据集,范围从 2000 年到 2018 年,即"have2000"-"have2018"。这些存储在'path_to_have_data' 的本地目录中。每个数据集包含几个变量,即var1、var2 等。我想加载这些数据集,然后根据var1 ne '0' 对它们进行子集化,同时保留原始数据集中的 var1 和 var2。此外,我想为每个子集添加一个新变量year,这样我就可以知道数据来自哪一年。最后,我想将所有新子集附加(堆叠)到一个名为appended 的数据集中。例如:
数据集Have2017 如下所示:
var1 var2 var3
0 2 5
3 7 9
数据集Have2018 如下所示:
var1 var2 var3
0 2 5
3 7 9
子集Want2017 如下所示:
var1 var2 year
3 7 2017
子集Want2018 看起来像这样:
var1 var2 year
3 7 2018
最终的数据集appended 如下所示:
var1 var2 year
3 7 2017
3 7 2018
以下 SAS 脚本可以解决问题:
libname raw 'path_to_have_data';
%macro a;
%do &year.=2000 %to 2018;
data want&year. (keep= var1 var2);
set raw.have&year.;
where var1 ne '0';
year=&year.;
run;
%end;
%mend;
%a;
data appended;
set want:;
run;
有人知道如何使用 R Studio 实现相同的结果吗?
编辑:问题的MCVE 版本
这是从原始帖子生成所需结果所需的 SAS 代码的工作版本。
首先,需要一个 DATA 步来创建一些 SAS 数据集。我们会将它们存储在默认的WORK 库中,而不是引用磁盘上的另一个库。
/* generate sample data */
data have2000 have2001 have2002;
input var1 var2 var3;
cards;
0 1 2
1 3 5
2 7 4
0 9 9
8 7 3
;
run;
接下来,我们需要对 SAS 宏进行一些编辑以使其运行。
/* run macro from OP */
options mprint; /* shows SAS code generated by macro processor */
/*
* corrections / adjustments made to macro
* 1. remove & in %do loop
* 2. add year to keep list
* 3. fix syntax error in where statement because var1 is numeric
* 4. use work library, and only process 3 years of data
*/
%macro a;
%do year = 2000 %to 2002;
data want&year. (keep= var1 var2 year);
set have&year.;
where var1 ne 0;
year=&year.;
run;
%end;
%mend;
/* run the macro */
%a;
SAS 选项mprint 导致 SAS 将宏生成的代码写入日志。当我们运行宏时,为单个数据集生成的代码子集如下所示。
MPRINT(A): data want2000 (keep= var1 var2 year);
MPRINT(A): set have2000;
MPRINT(A): where var1 ne 0;
MPRINT(A): year=2000;
MPRINT(A): run;
MPRINT(A): data want2001 (keep= var1 var2 year);
MPRINT(A): set have2001;
MPRINT(A): where var1 ne 0;
MPRINT(A): year=2001;
MPRINT(A): run;
MPRINT(A): data want2002 (keep= var1 var2 year);
MPRINT(A): set have2002;
MPRINT(A): where var1 ne 0;
MPRINT(A): year=2002;
MPRINT(A): run;
该宏生成三个 SAS 数据步骤,每年一个,包括以下更改。
- 删除
var3 - 删除
var1 = 0所在的行 - 将输出写入名为
want<year>的 SAS 数据集
最后,代码将刚刚创建的数据集组合成一个名为 appended 的单个 SAS 数据集。我们还将打印结果数据集。
data appended;
set want:; /* references all SAS datasets that start with "want" */
run;
proc print data = appended;
run;
...和输出:
【问题讨论】:
-
可以用文字描述您的脚本的作用 - 显然适用于非 SAS 用户。也很高兴看到示例输入和预期输出。
-
@markus - OP 有许多 SAS 数据集存储在一个目录中,
have2000到have2018。 SAS 宏读取每个数据集,对其进行子集化,添加一个year变量,然后将它们组合成一个 SAS 数据集。例如输入和输出,请看下面我的回答。