Как я могу написать шаг DATA, который удалит все переменные из входного набора данных, кроме тех, которые я явно определил в наборе данных?
Я хочу создать новый набор данных SAS с помощью таблицы foo
в качестве входного и взаимно-однозначного соответствия с записями в выходном наборе данных bar
, Я палочка, чтобы сбросить переменные из foo
по умолчанию, но мне также требуются все поля foo
быть доступным (для получения новых переменных), а также что некоторые переменные из foo
быть сохраненным (если явно указано).
В настоящее время я управляю явным списком переменных drop=
но это приводит к длинному и громоздкому синтаксису в объявлении опции набора данных.*
DATA bar (drop=id data_value2);
set foo;
new_id = id;
data_value1 = data_value1; /* Explicitly included for clarity */
new_derived_data_value = data_value2 * 2; /* etc. */
format new_id $fmt_id.
data_value1 $fmt_dat.
new_derived_data_value $fmt_ddat.
;
RUN;
В выходной таблице, которую я хочу, должны быть только поля data_value1
, new_data
а также new_derived_data_value
,
Я ищу наиболее синтаксически лаконичный способ воспроизведения того же эффекта, что и:
SELECT
id AS new_id
,data_value1
,data_value2 * 2 AS new_derived_data_value
FROM foo
Как я могу написать DATA
шаг, который удалит все переменные из входного набора данных, кроме тех, которые я явно определил в наборе данных?
* Обновление: я мог бы использовать aaa--hhh
Нотация типа, но даже это может быть громоздким, если порядок переменных меняется со временем, или я позже решу, что я хотел бы сохранить переменную ddd
,
2 ответа
Я бы сохранял имена переменных в списке макросов, полученных из таблиц DICTIONARY. Затем вы можете легко удалить их все в шаге данных. например
proc sql noprint;
select name into :vars separated by ' '
from dictionary.columns
where libname = 'SASHELP' and memname='CLASS';
quit;
data want (drop=&vars.);
set sashelp.class;
name1=name;
age1=age;
run;
Решение Кейта является лучшим производственным решением, но быстрой альтернативой, если вы знаете первую и последнюю переменные в наборе данных:
data want;
set class;
drop name--weight;
name1=name;
age1=age;
run;