Как я могу написать шаг 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;
Другие вопросы по тегам