2014-02-20 3 views
2

250 개가 넘는 변수가있는 데이터 세트가 있습니다. 특정 위치 (예 : 37 번째 변수 또는 113 번째 변수 등)에 배치해야하는 몇 가지 새로운 변수를 만들었지 만 목록의 맨 끝에 추가됩니다.SAS : 많은 변수 재정렬

나는 retain 문을 연구했지만 필자가 원하는 순서대로 모든 변수를 나열해야합니다. 누구나 이것에 대한 지름길을 제안 할 수 있습니까? - VARM 내가 반복 될 것이다 (교체 아웃 입력하지 않으 둘 사이에 3 ~ 20 변수 어디서나있을 수 있기 때문에

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을 시도 : 여기에 몇 가지 코드는 여러 데이터 세트의 경우). 다음은 내가 제작 한 오류입니다.

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...

어떤 도움을 주시면 감사하겠습니다.

-Brandon

+0

특정 변수가 특정 열 번호에 있어야한다는 것은 무엇입니까? 특정 위치에 기둥을 배치하는 것보다 더 나은 경로가 있어야하는 것 같습니다. – scott

+0

나는 - 답변을 설명하는 것처럼 작동하지 않는 동안 - 단일 대시가 작동한다는 것을 알았다. 변수 이름이 충분히 유사 할 때 언젠가 저장할 수 있습니다. 데이터 세트의 경우가 확실하지 않습니다. 솔직하게 나는이 점에서 -와 -의 차이가 어디에서 유래하는지 이해하지 못한다. – Vincent

답변

1

당신은 사용할 수 없습니다 - retain 작품은 데이터 세트의 변수는 PDV를 입력하기 전에이 동작하는 것을 유일한 이유 때문에 (더블 대쉬) 표기법을; 일단 SAS가 이러한 변수를 보게되면, 그것을 보는 순서대로 변수를 할당하며, 사용자는 자신의 위치를 ​​변경할 수 없습니다. 그러나 이중 대시 표기법은 이미 PDV에 해당 변수가 있어야하므로 두 가지 개념 (순서 변경 변수 및 이중 대시 표기)이 충돌합니다.

SAS에서 수행하려는 작업에 대한 훌륭한 해결책은 없습니다. 가장 간단한 해결책은 proc contents 출력을 사용하거나 비슷하게 dictionary.columns을 SQL에 사용하여 목록을 얻는 것입니다. 그러나 당신은 여전히 ​​그것에 어떻게 든 추가해야 할 것입니다.

내가 추천하는 가장 좋은 방법은 당신이 그들을 원하는 순서, 엑셀 스프레드 시트 (또는 CSV 또는 이와 유사한 것) 당신의 변수를 포함 만드는 것입니다. 당신은를 순서 VARNUM 옵션으로 PROC CONTENTS에서 처음이를 생성 할 수 있습니다 현재 변수 순서대로 (알파벳보다는) 변수.

그런 다음 스프레드 시트를 가져 와서 RETAIN 문에 사용하십시오. 열 name (변수 이름), var_order (데이터 집합의 순서)이 있고, -

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; 

은 위의 데이터 사전 스프레드 시트 (또한 등, 변수, 형식에 대한 정보가 들어 나는이 부르는 것)한다고 가정 active은 1 또는 공백 (활성 변수 1, 더 이상 활성 변수 0 또는 공백이 아님)입니다.