SAS:重新排序很多变量

时间:2014-02-20 20:41:15

标签: variables sas data-manipulation

我有一个包含250多个变量的数据集。我创建了几个需要放在特定位置的新变量(即第37个变量或第113个变量等),但是它们被添加到列表的最后。

我研究过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个变量,我不想输出(因为我会为多个数据集重复此操作)。这是我正在制作的错误:

  

错误:在先前定义的变量列表中找不到变量Q11_MM。   错误:在先前定义的变量列表中找不到变量Q11_INTERVIEWER。   错误:在先前定义的变量列表中找不到变量Q11_1。   等...

非常感谢任何帮助。

布兰登

1 个答案:

答案 0 :(得分:1)

您不能使用 - (双破折号)表示法,因为retain的唯一原因是它在数据集的变量进入PDV之前运行;一旦SAS看到这些变量,它就会按照它们看到的顺序分配它们,而你却无法改变它们的位置。但是,双破折号表示法要求PDV中已经有这些变量,因此两个概念(重新排序变量和双破折号表示法)发生冲突。

对于您在SAS中完全要做的事情,没有一个很好的解决方案。最简单的解决方案是在SQL中使用proc contents输出或类似dictionary.columns来获取列表;但是你仍然需要以某种方式增加它。

我建议的最佳解决方案是按照您希望的顺序创建包含变量的Excel电子表格(或CSV或类似)。您最初可以使用{{1}从PROC CONTENTS生成此变量}}选项,以当前变量顺序(而不是按字母顺序)对变量进行排序。

然后导入该电子表格,并在RETAIN语句中使用它。

VARNUM

以上假设您的数据字典电子表格(我称之为 - 还包含有关变量,格式等的信息)具有列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为1或空白(活动变量1,不再是活动变量0或空白)。