Variables SAS:对许多变量重新排序
我有一个超过250个变量的数据集。我已经创建了几个需要放置在特定位置的新变量(如第37个变量或第113个变量等),但是它们被添加到了列表的末尾 我已经研究过retain语句,但是它要求我按照我想要的顺序列出所有变量。有人能建议一条捷径吗?下面是一些代码:Variables SAS:对许多变量重新排序,variables,sas,data-manipulation,Variables,Sas,Data Manipulation,我有一个超过250个变量的数据集。我已经创建了几个需要放置在特定位置的新变量(如第37个变量或第113个变量等),但是它们被添加到了列表的末尾 我已经研究过retain语句,但是它要求我按照我想要的顺序列出所有变量。有人能建议一条捷径吗?下面是一些代码: data &CRF._1 (drop= studyParticipantCode formid participantID
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_面试官。
错误:在先前定义的变量列表中找不到变量Q11_1。
等等
任何帮助都将不胜感激
-Brandon您不能使用--(双破折号)符号,因为retain
工作的唯一原因是它在数据集变量进入PDV之前运行;一旦SAS看到这些变量,它就会按照看到它们的顺序分配它们,并且您不能更改它们的位置。但是,双破折号表示法要求PDV中已经有这些变量,因此这两个概念(重新排序变量和双破折号表示法)冲突
对于完全在SAS中执行的操作,没有很好的解决方案。最简单的解决方案是使用proc contents
输出,或者类似地使用SQL中的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\u order
(数据集中的顺序),以及active
为1或空白(active variables 1,不再是active variables 0或空白).您在做什么,使特定变量必须位于特定的列号中?似乎应该有一个比在特定位置放置列更好的路线。我发现虽然-,不起作用(如答案中所解释的),但单破折号确实起作用。当变量名足够相似时,它可以为您节省时间,尽管我不确定您的数据集中是否存在这种情况。坦率地说,我不明白在这方面,和之间的区别从何而来。