2014-02-20 72 views
2

我有一個包含250多個變量的數據集。我創建了幾個需要放置在特定位置的新變量(即作爲第37個變量或第113個變量等),但它們被添加到列表的最後。SAS:重新排序很多變量

我研究了retain語句,但它需要我列出所需的所有變量。任何人都可以提出一個捷徑嗎?下面是一些代碼:

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個變量,我不想打出來(因爲我會重複在任何地方這對於多個數據集)。這是我生產的錯誤:

ERROR: Variable Q11_MM cannot be found on the list of previously defined variables. ERROR: Variable Q11_INTERVIEWER cannot be found on the list of previously defined variables. ERROR: Variable Q11_1 cannot be found on the list of previously defined variables. etc...

任何幫助將不勝感激。

布蘭登

+0

你在做什麼,具體的變量需要在一個特定的列號?似乎應該有比將列放在特定位置更好的路線。 – scott

+0

我發現雖然 - 不起作用(正如答案中所解釋的那樣),單破折號 - 確實有效。當變量名稱足夠相似時,它可以節省您的時間,儘管我不確定數據集是否屬於這種情況。坦率地說,我不明白 - 和 - 之間的區別在哪裏。 – Vincent

回答

1

您無法使用 - 因爲唯一原因retain作品是它的數據集的輸入變量的PDV運行之前(雙橫線)符號;一旦SAS看到這些變量,它就按照它看到的順序進行分配,而且你不能改變它們的位置。但是,雙破折號表示法需要在PDV中具有這些變量,因此這兩個概念(重新排序變量和雙重符號表示法)會發生衝突。

沒有一個很好的解決方案,你正試圖完全在SAS內完成。最簡單的解決方案是使用SQL中的proc contents輸出或類似dictionary.columns來獲取列表;但你仍然必須以某種方式補充。

我建議最好的解決方案是創建一個Excel電子表格(或CSV或類似),其中包含你的變量,你希望他們的順序,你可以用VARNUM選項,哪些訂單最初產生這個從PROC CONTENTS以當前可變順序變量(而不是按字母順序)。

然後導入該電子表格,並在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或空白)。