我有一个包含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。 等...
非常感谢任何帮助。
布兰登
答案 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或空白)。