SAS: переупорядочивание МНОЖЕСТВА переменных

У меня есть набор данных с более чем 250 переменными. Я создал несколько новых переменных, которые необходимо разместить в определенных местах (например, как 37-ю переменную, 113-ю переменную и т. д.), однако они добавляются в самый конец списка.

Я исследовал оператор сохранения, но он требует, чтобы я перечислил ВСЕ переменные в том порядке, в котором я хочу. Может ли кто-нибудь предложить ярлык для этого? Вот код:

data &CRF._1 (drop= studyParticipantCode                
                formid 
                participantID
                formStatusID 
                contactItemID
                lastTab
                phaseID  
                notCompleted 
                notCompletedReasonID 
                notCompletedReasonOther);
retain patid cycleID OwnerTypeID &Qn._MM -- &Qn._YYYY &Qn._MDY &Qn._INTERVIEWER -- &Qn._TIMEENDED &Qn._TIMETOTAL
        &Qn._1 -- &Qn._12AYYYY &Qn._12MDY &Qn._13 -- &Qn._13AYYYY &Qn._13MDY &Qn._14 -- &Qn._14AYYYY &Qn._14MDY
        &Qn._14b1 -- &Qn._15AYYYY &Qn._15aMDY &Qn._15B -- &Qn._15BYYYY &Qn._15bMDY &Qn._15C -- &Qn._15CYYYY &Qn._15cMDY
        &Qn._15D -- &Qn._15DYYYY &Qn._15dMDY  &Qn._16 -- &Qn._31A3YYYY &Qn._31aMDY &Qn._31A4A -- &Qn._31B3YYYY
        &Qn._31bMDY &Qn._31B4A -- &Qn._31C3YYYY &Qn._31cMDY &Qn._31C4A -- &Qn._31D3YYYY &Qn._31dMDY &Qn._31D4A -- &Qn._31E3YYYY
        &Qn._31eMDY &Qn._31E4A -- &Qn._31F3YYYY &Qn._31fMDY &Qn._31F4A -- &Qn._31G3YYYY &Qn._31gMDY &Qn._31G4A -- &Qn._31H3YYYY
        &Qn._31hMDY &Qn._31H4A -- &Qn._31I3YYYY &Qn._31iMDY;
set &CRF.;
Site            = substr(patid,6,4);
Sitecycle       = strip(Site)||strip(put(&byvar.,5.));
%inc labels;
%inc formats;

Я попробовал varN -- varM, потому что между двумя переменными может быть от 3 до 20 переменных, которые я не хочу вводить (поскольку я буду повторять это для нескольких наборов данных). Вот ошибка, которую я создаю:

ОШИБКА: переменная Q11_MM не может быть найдена в списке ранее определенных переменных. ОШИБКА: переменная Q11_INTERVIEWER не может быть найдена в списке ранее определенных переменных. ОШИБКА: переменная Q11_1 не может быть найдена в списке ранее определенных переменных. так далее...

Любая помощь будет принята с благодарностью.

-Брэндон


person BWalsh    schedule 20.02.2014    source источник
comment
Что вы делаете, чтобы конкретные переменные были в столбце с определенным номером? Кажется, должен быть лучший маршрут, чем размещение столбцов в определенном месте.   -  person scott    schedule 21.02.2014
comment
Я узнал, что пока -- не работает (как объяснено в ответе), одиночный тире -- работает. Это может спасти вас когда-нибудь, когда имена переменных достаточно похожи, хотя я не уверен, что это так в вашем наборе данных. Честно говоря, я не понимаю, откуда берется разница между -- и -- в этом отношении.   -  person Vincent    schedule 14.07.2016


Ответы (1)


Вы не можете использовать нотацию -- (двойное тире), потому что единственная причина, по которой retain работает, заключается в том, что она работает до того, как переменные набора данных войдут в PDV; как только SAS увидит эти переменные, он присвоит их в том порядке, в котором их видит, и вы не сможете изменить их положение. Однако запись с двойным тире требует, чтобы эти переменные уже были в PDV, поэтому две концепции (изменение порядка переменных и запись с двойным тире) конфликтуют.

Не существует отличного решения для того, что вы пытаетесь сделать полностью в рамках SAS. Самое простое решение — использовать вывод proc contents или аналогичный dictionary.columns в SQL для получения списка; но вам все равно придется как-то добавить к этому.

Лучшее решение, которое я рекомендую, — создать электронную таблицу Excel (или CSV или аналогичную), содержащую ваши переменные, в том порядке, в котором вы хотите. Вы можете создать это изначально из PROC CONTENTS с опцией VARNUM, которая упорядочивает переменную в текущем переменный порядок (а не алфавитный).

Затем импортируйте эту таблицу и используйте ее в операторе RETAIN.

proc import file="mydatadictionary.xlsx" out=datadict dbms=excel replace;
run;

proc sql;
select name into :orderlist separated by ' '
from datadict
where active=1
order by var_order;
quit;

data want;
retain &orderlist.;
set have;
run;

Вышеприведенное предполагает, что ваша электронная таблица словаря данных (как я это называю — также содержит информацию о переменных, форматах и ​​т. д.) имеет столбцы name (имя переменной), var_order (порядок в наборе данных) и active, который равен 1 или пуст ( активные переменные 1, больше не активные переменные 0 или пусто).

person Joe    schedule 20.02.2014