У меня есть набор наборов данных SAS с именем "haveyear", начиная с 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, необходимая для получения требуемого результата из исходного сообщения.
Во-первых, для создания нескольких наборов данных SAS требуется шаг DATA.Мы будем хранить их в стандартной библиотеке 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
- Запись выходных данных в набор данных SAS с именем
want<year>
Наконец, код объединяет только что созданные наборы данных в один набор данных SAS, называемый appended
.Мы также распечатаем полученный набор данных.
data appended;
set want:; /* references all SAS datasets that start with "want" */
run;
proc print data = appended;
run;
... и вывод: